3 回答
TA贡献1719条经验 获得超6个赞
覆盖是当override
在基类中定义该方法时,在后代类中提供方法的新实现时virtual
。
隐藏是当你提供了当该方法的新的实现在子类中的方法不是在基类中的定义virtual
,或者当你的新的实现并没有指定override
。
隐藏往往很糟糕; 你应该尽量不要这样做,如果你可以完全避免它。隐藏可能会导致意外事件发生,因为隐藏方法仅在调用您定义的实际类型的变量时使用,而不是在使用基类引用时...另一方面,被覆盖的虚拟方法最终会被即使在子类上使用基类引用调用时,也会调用正确的方法版本。
例如,考虑以下类:
public class BaseClass{ public virtual void Method1() //Virtual method { Console.WriteLine("Running BaseClass Method1"); } public void Method2() //Not a virtual method { Console.WriteLine("Running BaseClass Method2"); }}public class InheritedClass : BaseClass{ public override void Method1() //Overriding the base virtual method. { Console.WriteLine("Running InheritedClass Method1"); } public new void Method2() //Can't override the base method; must 'new' it. { Console.WriteLine("Running InheritedClass Method2"); }}
让我们在匹配的引用中使用InheritedClass的实例来调用它:
InheritedClass inherited = new InheritedClass();inherited.Method1();inherited.Method2();
这会返回你应该期待的东西; 两种方法都表示它们正在运行InheritedClass版本。
运行InheritedClass方法1
运行InheritedClass Method2
此代码创建相同的实例InheritedClass,但将其存储在BaseClass引用中:
BaseClass baseRef = new InheritedClass();baseRef.Method1();baseRef.Method2();
通常,根据OOP原则,您应该期望与上面的示例相同的输出。但是你得不到相同的输出:
运行InheritedClass方法1
运行BaseClass方法2
当您编写InheritedClass代码时,您可能希望所有调用Method2()
都运行您在其中编写的代码。通常,这将是它的工作原理 - 假设您正在使用virtual
已被覆盖的方法。但是因为您使用的是new
/ hidden方法,所以它会调用您正在使用的引用上的版本。
如果这是你真正想要的行为,那么; 你去吧 但我强烈建议如果这就是你想要的,那么代码可能存在更大的架构问题。
TA贡献1872条经验 获得超3个赞
方法重写是简单地覆盖派生类中基类方法的默认实现。
方法隐藏:您可以在派生类中的虚方法之前使用'new'关键字
如
class Foo { public virtual void foo1() { } } class Bar:Foo { public new virtual void foo1() { } }
现在,如果您创建另一个派生自Bar的类Bar1,您可以覆盖在Bar中定义的foo1。
- 3 回答
- 0 关注
- 372 浏览
添加回答
举报