Peringatan "Gunakan kata kunci baru jika memang sengaja menyembunyikan"


101

Saya memiliki peringatan di bagian bawah layar saya:

Peringatan 1 'WindowsFormsApplication2.EventControlDataSet.Events' menyembunyikan anggota yang diwariskan 'System.ComponentModel.MarshalByValueComponent.Events'. Gunakan kata kunci baru jika memang dimaksudkan untuk menyembunyikan. C: \ Users \ myComputer \ Desktop \ Event Control \ WindowsFormsApplication2 \ EventControlDataSet.Designer.cs 112 32 eventControl

Jika saya mengklik dua kali di atasnya, itu muncul dengan:

public EventsDataTable Events {
    get {
        return this.tableEvents;
    }

Adakah yang bisa memberi tahu saya bagaimana menyingkirkan ini?

Jawaban:


144

Kelas Anda memiliki kelas dasar, dan kelas dasar ini juga memiliki properti (yang bukan virtual atau abstrak) yang disebut Peristiwa yang diganti oleh kelas Anda. Jika Anda berniat untuk menggantinya, letakkan kata kunci "baru" setelah pengubah publik. MISALNYA

public new EventsDataTable Events
{
  ..
}

Jika Anda tidak ingin menimpanya, ubah nama properti Anda menjadi nama lain.


23
Berikut ini tautan untuk siapa saja yang ingin mengetahui perbedaan antara new dan override.
starsplusplus

Kata new kunci akan menghilangkan kesalahan kompilasi, tetapi dapat menyebabkan perilaku yang tidak diinginkan lainnya. Saya pikir Anda harus menambahkan peringatan pada jawaban Anda. Itu akan membantu untuk memahami konsekuensi dari penambahan new.
ahong

13

@wdavo benar. Hal yang sama juga berlaku untuk fungsi.

Jika Anda mengganti fungsi dasar, seperti Update, maka di subclass Anda, Anda perlu:

new void Update()
{
  //do stufff
}

Tanpa new di awal decleration fungsi Anda akan mendapatkan flag peringatan.


6

Pada kode di bawah ini, Class Amengimplementasikan antarmuka IShowdan mengimplementasikan metodenya ShowData. Class Bmewarisi Class A. Untuk menggunakan ShowDatametode di Class B, kita harus menggunakan kata kunci newdalam ShowDatametode untuk menyembunyikan Class Ametode kelas dasar dan menggunakan overridekata kunci untuk memperluas metode.

interface IShow
{
    protected void ShowData();
}

class A : IShow
{
    protected void ShowData()
    {
        Console.WriteLine("This is Class A");
    }
}

class B : A
{
    protected new void ShowData()
    {
        Console.WriteLine("This is Class B");
    }
}

3
Tidak ada overridedalam contoh Anda dari penjelasan Anda dan overridetidak diperlukan.
Etienne Faucher

Saya pikir teladan Anda berada di jalur yang benar, tetapi tidak lengkap. Juga penjelasan Anda tidak jelas. Bisakah Anda mengedit jawaban Anda menjadi sesuatu yang lebih mirip dotnetfiddle.net/Iw0OzB ? Jika tidak, saya mungkin akan memposting biola saya sebagai jawaban lain
ahong

0

Fungsi induk membutuhkan virtualkata kunci, dan fungsi anak membutuhkan overridekata kunci di depan definisi fungsi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.