这些对象之间的区别?

Difference between these objects?

我有这两个类

class Animal
{
    public string name;

    public virtual void MakeSound()
    {
        Console.WriteLine("some sound");
    }
}

class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("bark");
    }
}

我想知道这两个对象之间的区别在哪里?

Animal dog = new Dog();
Dog dog2 = new Dog();

编辑:我的问题是我不理解这两个对象背后的过程/思想。是的,它们都是 Dog() 对象,但我不明白为什么我有可能将 Animal 和 Dog 分配给该类型。我知道“分配”是错误的措辞,但我有可能这样做对我来说似乎很奇怪。

到目前为止,编程一直对我“苛刻”。一切都必须有正确的语法,一切都必须以正确的顺序进行,一切都必须有意义。如果不是这样,我会收到错误消息 List<int> list = new List<int>; 不起作用,List<int> list = new List(); 也不起作用。这就是为什么我没有得到这两个对象。在我看来,就功能而言,它们都可以做同样的事情。但它们真的一样吗?

没有太大区别。

唯一真正的区别是,如果您要在 Dog class 中实现 public 方法或 属性 而不是 Animal class,除非像 ((Dog)dog).SomeProperty.

那样投射,否则您将无法访问它们

可能您唯一一次使用 Animal class 而不是 Dog class 是在您需要包含所有动物的 List 时。

由于 Animal class 更通用,您可以仅用于声明,例如,如果您还不知道什么是动物,并根据需要更改为另一个 subclass .假设您还有:

     class Cat: Animal
     {
        public override void MakeSound()
        {
             Console.WriteLine("mew");
        }
      }

你可以这样做:

        Animal animal = new Dog();
        Dog dog2 = new Dog();
        
        animal.MakeSound();
        
        animal = new Cat();
        animal.MakeSound();

输出为: 吠 喵

如果只使用 Dog class,则必须为 Cat 创建另一个变量。

希望对你有所帮助。


编辑

当你制作一个包含不同动物的列表或字典(或其他集合)时,可以看到它的威力:

var animals = new List<Animal>();
animals.Add(new Dog("Rover"));
animals.Add(new Cat("Tiger"));

foreach (var animal in animals)
{
    Console.WriteLine($"{animal.name} goes:");
    animal.MakeSound();
}

输出:

Rover goes:
bark
Tiger goes:
mew