我试图了解继承如何在C#中工作.我写了以下代码:
class Program
{
static void Main(string[] args)
{
Animal animal = new Dog();
animal.OverRideMe();
//animal.NewMethod();
Dog dog = (Dog)animal;
dog.OverRideMe();
dog.NewMethod();
Console.Read();
}
}
public abstract class Animal
{
public Animal()
{
Console.WriteLine("Base Constructor");
}
public virtual void OverRideMe()
{
Console.WriteLine("In Base Class's OverRideMe");
Console.Read();
}
}
public class Dog : Animal
{
public Dog()
{
Console.WriteLine("Derived Constructor");
}
public override void OverRideMe()
{
Console.WriteLine("In Derived Class's OverRideMe");
Console.Read();
}
public void NewMethod()
{
Console.WriteLine("In Derived Class's NewMethod");
Console.Read(); …Run Code Online (Sandbox Code Playgroud) 昨天我发布了一个关于new/virtual/override关键字的问题,我从你的答案中学到了很多东西.但我仍有一些疑虑.
在所有"盒子"之间,我与类型的方法表中真正发生的事情失去联系.例如:
interface I1 { void Draw(); }
interface I2 { void Draw(); }
class A : I1, I2
{
public void Minstance() { Console.WriteLine("A::MInstance"); }
public virtual void Draw() { Console.WriteLine("A::Draw"); }
void I2.Draw() { Console.WriteLine("A::I2.Draw"); }
}
class B : A, I1, I2
{
public new virtual void Draw() { Console.WriteLine("B::Draw"); }
void I1.Draw() { Console.WriteLine("B::I1.Draw"); }
}
class Test
{
public static void Main()
{
A a = new B();
a.Draw();
I1 i1 = new A();
i1.Draw(); …Run Code Online (Sandbox Code Playgroud) 鉴于以下内容:
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 …Run Code Online (Sandbox Code Playgroud)