相关疑难解决方法(0)

关于继承C#

我试图了解继承如何在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)

c# inheritance

5
推荐指数
1
解决办法
217
查看次数

有关Virtual/new ... plus接口的更多信息!

昨天我发布了一个关于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)

c# virtual overriding interface new-operator

4
推荐指数
1
解决办法
449
查看次数

方法覆盖C#

鉴于以下内容:

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)

c# oop inheritance

0
推荐指数
1
解决办法
413
查看次数

标签 统计

c# ×3

inheritance ×2

interface ×1

new-operator ×1

oop ×1

overriding ×1

virtual ×1