1

私は C# での継承を理解しようとしています。そのため、いくつかのサンプルを試していますが、newキーワードを使用する場合と使用しない場合は同じであることがわかりました。

では、なぜ新しいキーワードが必要なのでしょうか?

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            List<int> col = new List<int>();
            Class1 c1 = new Class1();
            Class2 c11 = new Class2();
            Class1 c111 = new Class3();
            c1.setmessage();
            c11.setmessage();
            c111.setmessage();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }
   
}
class Class1
{
    private string member;

    public  void setmessage()
    {
        MessageBox.Show("Class1");
    }
}

class Class2 : Class1
{
    private string member;

    public  void setmessage()
    {
        MessageBox.Show("Class2");
    }
}
4

3 に答える 3

13

このコンテキストでのキーワードは、メソッドのシャドーイングnewを意味します。

これは、基本クラスのメソッドをオーバーライドするのではなく、継承に関する限り、完全に別のメソッドを作成することを意味します。

ほとんどの場合、これはエラーであり、メソッドは単にオーバーライドする必要があるため、オーバーライドされていないオーバーライド可能なメソッドに使用されていない場合、コンパイラは警告を発行します。newそこにキーワードがあることは、シャドウイングが明示的な決定であったことを示しています。

C# でのシャドーイングとオーバーライドの違いを参照してください。.

于 2012-04-06T13:07:32.323 に答える
6

キーワードがないnewと、コンパイラは警告を表示します。これは、コンパイラがそれを非表示にする意図があるかどうかわからないためです。newまたはを指定overrideして、コンパイラが間違いを犯していないことを認識できるようにする必要があります。

privateこれは、「クラス メンバーはデフォルトで非公開になっているのに、なぜクラス メンバーのキーワードがあるのですか?」に似ています。internalおよび「クラスはデフォルトで内部にあるのに、なぜクラスのキーワードがあるのですか?」。一般的な答えは、通常は暗黙的よりも明示的である方がよいというものです。

于 2012-04-06T13:10:06.410 に答える