这些对象之间的区别?
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
我有这两个类
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