6

「DisplayTitle」というメソッドを実装する「Parent」という抽象的な親クラスがあるとします。このメソッドを「Parent」を継承する各サブクラスで同じにしたい-サブクラスが独自の「DisplayTitle」メソッドを実装しようとすると、コンパイルエラーが発生します。どうすればC#でこれを達成できますか。私はJavaを信じており、メソッドを「final」としてマークするだけですが、C#で代替手段を見つけることができないようです。「封印」と「オーバーライド」をいじっていますが、探している動作が得られません。

たとえば、次のコードでは次のようになります。

using System;

namespace ConsoleApplication1
{
  class Parent
  {
      public void DisplayTitle() { Console.WriteLine("Parent's Title"); }
  }

  class ChildSubclass : Parent
  {
      public void DisplayTitle() { Console.WriteLine("Child's Own Implementation of Title"); 
  }

    static void Main(string[] args)
    {
        ChildSubclass myChild = new ChildSubclass();
        myChild.DisplayTitle();
        Console.ReadLine();
    }
  }
}

「ChildSubClass」は「DisplayTitle」をオーバーライドできないというコンパイルエラーを受け取りたいのですが。現在、警告が表示されますが、これは実行できるはずのことであり、メソッドにラベルを付けるための適切な属性がわかりません。

4

4 に答える 4

11

どうすればC#でこれを達成できますか。私はJavaを信じており、メソッドを「final」としてマークするだけですが、C#で代替手段を見つけることができないようです。

大まかに同等のものはsealedC#にありますが、通常は仮想メソッドにのみ必要であり、DisplayTitleメソッドは仮想ではありません。

これはオーバーライドでChildSubclass はなく、非表示DisplayTitleになっていることに注意することが重要です。参照のみを使用するコードは、その実装を呼び出すことにはなりません。Parent

newコードをそのまま使用すると、次のメソッドに修飾子を追加するように通知するコンパイル時の警告が表示されることに注意してくださいChildSubclass

public new void DisplayTitle() { ... }

派生クラスが完全に作成されないようにクラス自体をシールする以外に、派生クラスが既存のメソッドを非表示にするのを止めることはできません...しかし、派生型を直接使用しない呼び出し元は気にしません。

ここであなたの本当の懸念は何ですか?偶発的な誤用、または意図的な問題?

編集:サンプルコードの警告は次のようになることに注意してください。

Test.cs(12,19): warning CS0108:
        'ConsoleApplication1.ChildSubclass.DisplayTitle()' hides inherited
        member 'ConsoleApplication1.Parent.DisplayTitle()'. Use the new keyword
        if hiding was intended.

警告をエラーに変えることをお勧めします。そうすれば、警告を無視するのが難しくなります:)

于 2012-10-04T17:32:48.970 に答える
2

派生クラスはメソッドをオーバーライドできません。仮想として宣言していません。これがJavaと比較してC#で非常に異なることに注意してください。すべてのメソッドは、Javaでは仮想です。C#では、キーワードを明示的に使用する必要があります。

派生クラスは、同じ名前を再度使用することでメソッドを非表示にすることができます。これはおそらくあなたが話しているコンパイル警告です。newキーワードを使用すると、警告が抑制されます。このメソッドは元のメソッドをオーバーライドしません。基本クラスのコードは、派生クラスのメソッドではなく、常に元のメソッドを呼び出します。

于 2012-10-04T17:32:49.867 に答える
1

封印された修飾子を使用して、サブクラスがクラス、プロパティ、またはメソッドをオーバーライドしないようにします。密封されたものを使用すると何が機能しませんか?

http://msdn.microsoft.com/en-us/library/88c54tsw.aspx

于 2012-10-04T17:30:06.167 に答える
0

メソッド修飾子キーワードを使用したC#では、必要なことは不可能であると確信しています。

封印は、祖先クラスの仮想メソッドをオーバーライドする場合にのみ適用されます。これにより、それ以上のオーバーライドが防止されます。

于 2012-10-04T17:39:05.540 に答える