【问题标题】:Difference between the reference types of derived and base classes派生类和基类的引用类型的区别
【发布时间】:2020-06-01 17:18:11
【问题描述】:

伙计们,我需要你的帮助。

我们有这个代码:

class Program
{

    static void Main(string[] args)
    {
        Animal pig = new Pig();

        Pig pig2 = new Pig();

        List<Animal> Animals = new List<Animal>();
        Animals.Add(pig);
        Animals.Add(pig2);

        foreach(Animal a in Animals)
        {
            Animal.AnimalSound();
        }
    }
}


class Animal    
{
    public virtual void AnimalSound()
    {
        Console.WriteLine("AnimalSound");
    }
}

class Pig : Animal
{
    public override void AnimalSound()
    {
        Console.WriteLine("wee wee!");
    }
}

我的问题是当我实例化变量 pig 和 pig2 有什么区别 Animal pig = new Pig();和猪 pig2 = new Pig();

为什么不将它们都声明为 ReferenceType Pig,因为 Pig 一如既往地是 Animal??

【问题讨论】:

  • 您的代码中没有pig2 声明
  • 类的每个实例都是不同的内存位置。所以试图匹配对象 pig 不会匹配。
  • @PrakashReddyPotlapadu Animal 不是界面
  • @TheBatman 他可以实例化该类型的列表,即使它是一个接口。
  • 对不起,我有一些错误并更正了。现在看看

标签: c# class inheritance polymorphism


【解决方案1】:

不同的是,当你这样做Animal pig = new Pig();时,name是不可访问的,但在这种情况下Pig pig2 = new Pig();是可以访问name的。您总是从基类继承,因为您想使用父类的一些现成行为,并希望在子类中添加一些特定于子类的行为。猪永远是动物,但并非所有动物都不是猪。

class Pig : Animal
{
    public string name;

    public override void AnimalSound()
    {
        Console.WriteLine("wee wee!");
    }
}

【讨论】:

    【解决方案2】:

    所以你有基类Animal 和派生类Pig。所以我们的问题可以总结为基类和派生类有什么区别:

    基类是其他类的派生类。

    派生类是在现有类的基础上创建的类。派生类的一些特性:

    • 派生类几乎继承了基类的所有属性。 Private 属性由于可访问性级别而无法访问,但是您可以使用反射来读取它们的值。
    • 派生类可以向自身添加新成员或更改基类成员。

    【讨论】:

      猜你喜欢
      • 2014-04-15
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 2018-12-08
      • 2019-04-05
      • 2023-03-19
      • 2018-07-31
      • 1970-01-01
      相关资源
      最近更新 更多