Mou*_*Mou 0 c# oop inheritance
鉴于以下内容:
class BC
{
public void Display()
{
System.Console.WriteLine("BC::Display");
}
}
class DC : BC
{
new public void Display()
{
System.Console.WriteLine("DC::Display");
}
}
class Demo
{
public static void Main()
{
BC b;
b = new BC();
b.Display();
b = new DC();
b.Display();
}
}
Run Code Online (Sandbox Code Playgroud)
我理解以下代码调用基类Display()方法:
BC b;
b = new BC();
b.Display();
Run Code Online (Sandbox Code Playgroud)
并且以下行调用派生类Display(),它通过使用new关键字隐藏基类实现:
b = new DC();
b.Display();
Run Code Online (Sandbox Code Playgroud)
我想知道new关键字在内部做了什么.
此代码的来源包括以下说明:
由于b包含对DC类型对象的引用,因此可以期望
Display()执行DC类的功能.但这不会发生.相反,执行的是Display()BC类.那是因为函数是根据引用的类型而不是引用变量b引用的内容来调用的.由于b是BC类型的Display()引用,因此无论b指的是谁,都将调用BC类的函数.
我对这一点非常困惑:"因为函数是根据引用的类型调用的,而不是参考变量b引用的内容"
"基于引用类型调用函数"的含义在这里
b = new DC();
b.Display();
Run Code Online (Sandbox Code Playgroud)
这是什么类型的b?它被声明为类的实例名称,BC
但后来b成为类的实例DC.
你所做的不是压倒一切,而是阴影.该new关键字可以有一个Display在两个类方法BC和DC,但方法不是在所有相关的,他们只是有相同的名称.
要覆盖该方法,您需要使用类中virtual方法的关键字以及BC类中的overrides方法DC.
在为方法着色时,它是决定使用哪种方法的引用类型:
BC b1;
b1 = new BC();
b1.Display(); // Calls the method in BC
BC b2;
b2 = new DC();
b2.Display(); // Calls the method in BC
DC d1;
d1 = new DC();
d1.Display(); // Calls the method in DC
Run Code Online (Sandbox Code Playgroud)
覆盖该方法如下所示:
class BC {
public virtual void Display() {
System.Console.WriteLine("BC::Display");
}
}
class DC : BC {
override public void Display() {
System.Console.WriteLine("DC::Display");
}
}
Run Code Online (Sandbox Code Playgroud)
覆盖方法时,方法是相关的,它是决定使用哪个方法的对象的实际类型,而不是引用的类型:
BC b1;
b1 = new BC();
b1.Display(); // Calls the method in BC
BC b2;
b2 = new DC();
b2.Display(); // Calls the method in DC
DC d1;
d1 = new DC();
d1.Display(); // Calls the method in DC
Run Code Online (Sandbox Code Playgroud)
覆盖和阴影之间的另一个区别是,当您隐藏方法时,根本不必相似,new关键字只是告诉编译器您要将标识符重用于基类之外的其他内容.覆盖方法时,方法签名必须相同.
例如,您可以使用string与类型的私有属性完全不同的公共方法进行阴影处理int:
public class X {
public void XX(string z) { }
}
public class Y : X {
private new int XX { get; set; }
}
X x = new Y();
x.XX();
Y y = new Y();
y.XX = 42;
Run Code Online (Sandbox Code Playgroud)