元のアドレス: クリックしてリンクを開きます
これには多くの意味があります。これは、たとえば、派生クラスのメンバーと同じ名前を持つ新しいメンバーを基本クラスに導入することが C# で完全にサポートされており、予期しない動作が発生しないことを意味します。 これは、メソッドが継承されたメソッドをオーバーライドするのか、それとも類似の名前を持つ継承されたメソッドを非表示にする新しいメソッドをオーバーライドするのかをクラスが明示的に宣言する必要があることも意味します。
C# では、派生クラスに基本クラスのメソッドと同じ名前のメソッドを含めることができます。
Base クラスのメソッドは仮想として定義する必要があります。
派生クラスのメソッドの前に new キーワードまたは override キーワードが指定されていない場合、コンパイラは警告を発行し、メソッドは new キーワードが存在するかのように動作します。
派生クラスのメソッドの前に new キーワードが付いている場合、そのメソッドは基本クラスのメソッドから独立したものとして定義されます。
派生クラスのメソッドの前に override キーワードが付いている場合、派生クラスのオブジェクトは、基本クラスのメソッドを呼び出す代わりに、そのメソッドを呼び出します。
base キーワードを使用して、派生クラスから基本クラスのメソッドを呼び出すことができます。
override、virtual、および new キーワードは、プロパティ、インデクサー、イベントでも使用できます。
メソッドが仮想として宣言されている場合、そのメソッドを継承するクラスは独自のバージョンを実装できます。 メソッドを仮想化するには、基本クラスのメソッド宣言で virtual 修飾子を使用する必要があります。 その後、派生クラスは override キーワードを使用して基本仮想メソッドをオーバーライドしたり、new キーワードを使用して基本クラス内の仮想メソッドを非表示にしたりできます。 override キーワードも new キーワードも指定されていない場合、コンパイラーは警告を発行し、派生クラスのメソッドは基本クラスのメソッドを非表示にします。
GraphicsClass は次のとおりです:
C#
class GraphicsClass { public virtual void DrawLine() { } public virtual void DrawPoint() { } }
あなたの会社はこのクラスを使用しており、新しいメソッドを追加するときにそれを使用して独自のクラスを派生します。れーれー
会社 A が次のコードのような
GraphicsClass
そもそも、問題はありませんでした。
新しいバージョンは、古いバージョンとのバイナリ互換性を維持します。
派生クラスでは、メソッド DrawRectangle への既存の呼び出しは引き続きバージョンを参照します。
この警告は、アプリケーション内で
メソッドをどのように機能させるかを検討する必要があることを思い出させるものです。
メソッドで新しい基本クラスのメソッドをオーバーライドする場合は、
キーワードを使用してください:
C# 派生自 YourDerivedGraphicsClass 的对象仍可以使用基关键字访问DrawRectangle 的基类版本 C# 为了避免这两个方法之间发生混淆,可以重命名您的方法。 这可能很耗费时间且容易出错,而且在某些情况下并不可行。 但是,如果您的项目相对较小,则可以使用 Visual Studio 的重构选项来重命名方法。 有关更多信息,请参见重构类和类型(类设计器)。 或者,也可以通过在派生类定义中使用关键字 new 来防止出现该警告: C# 这是默认行为。 重写和方法选择 下面的方法将是兼容的: C# 重写方法不被视为是在类上进行声明的,而是在基类上声明的方法的新实现。 仅当 C# 编译器无法将方法调用与 Derived 上的原始方法匹配时,它才尝试将该调用与具有相同名称和兼容参数的重写方法匹配。 例如: C# 有两种方法可以避免此情况。 首先,避免将新方法声明为与虚方法同名。 其次,可以通过将 Derived 的实例强制转换为 Base 来使 C# 编译器搜索基类方法列表,从而使其调用虚方法。 由于是虚方法,因此将调用 Derived 上的 DoWork(int) 的实现。 例如: C# 有关 new 和 override的更多示例,请参见 了解何时使用 Override 和 New 关键字(C# 编程指南)。 以上就是使用 Override 和 New 关键字进行版本控制(C# 编程指南)的内容,更多相关内容请关注PHP中文网(www.php.cn)!class YourDerivedGraphicsClass : GraphicsClass
{ public void DrawRectangle() { }
}
base.DrawRectangle();
class YourDerivedGraphicsClass : GraphicsClass
{ public new void DrawRectangle() { }
}
public class Derived : Base
{ public override void DoWork(int param) { } public void DoWork(double param) { }
}
int val = 5;
Derived d = new Derived();
d.DoWork(val); // Calls DoWork(double).
((Base)d).DoWork(val); // Calls DoWork(int) on Derived.