想知道以下两者之间的区别:
案例1:基类
public void DoIt();
案例1:继承类
public new void DoIt();
案例2:基类
public virtual void DoIt();
案例2:继承类
public override void DoIt();
根据我运行的测试,情况1和2似乎具有相同的效果。有区别吗,或者有更好的方式吗?
想知道以下两者之间的区别:
案例1:基类
public void DoIt();
案例1:继承类
public new void DoIt();
案例2:基类
public virtual void DoIt();
案例2:继承类
public override void DoIt();
根据我运行的测试,情况1和2似乎具有相同的效果。有区别吗,或者有更好的方式吗?
当前回答
new:它只是隐藏基类的方法,但如果你想要访问它。
override:它覆盖了基类的方法,即使你想访问它也无法访问。
例子
using System;
public class Program
{
public static void Main()
{
BaseClass test = new DerivedClass();
var result = test.DoSomething();
Console.WriteLine(result);
}
class BaseClass
{
public string DoSomething()
{
return "Base result";
}
}
class DerivedClass : BaseClass
{
public new string DoSomething()
{
return "Derived result";
}
}
}
结果:基础结果
附注:我从下面的链接复制并稍微改变了上面的例子: https://stackoverflow.com/a/45822233/10995103
其他回答
请尝试以下操作:(case1)
((BaseClass)(new InheritedClass())).DoIt()
编辑:virtual+override在运行时被解析(因此override真正覆盖虚拟方法),而new只是创建同名的新方法,并隐藏旧方法,它在编译时被解析->你的编译器将调用它'看到'的方法
none、virtual、override、new和abstract的所有组合:
在第一种情况下,您将定义隐藏在父类中。这意味着只有在将对象作为子类处理时才会调用它。如果将类强制转换为其父类型,则将调用父类的方法。在第二个实例中,该方法将被重写,并将被调用,而不管对象是转换为子类还是父类。
其中,new是最令人困惑的。通过实验,new关键字就像给开发人员提供了一个选项,通过显式定义类型,用基类实现覆盖继承的类实现。这就像反过来思考一样。
在下例中,结果将返回"Derived result",直到类型显式定义为BaseClass test,才会返回"Base result"。
class Program
{
static void Main(string[] args)
{
var test = new DerivedClass();
var result = test.DoSomething();
}
}
class BaseClass
{
public virtual string DoSomething()
{
return "Base result";
}
}
class DerivedClass : BaseClass
{
public new string DoSomething()
{
return "Derived result";
}
}
如果派生类中使用了关键字重写,则其重写父方法。
如果派生类中使用了关键字new,则派生方法被父方法隐藏。