Animal a = new Dog();我创建的对象a是Animal类型的还是Dog类型的?
a.eat();我调用的是Animal的方法还是Dog的?
在什么情况下使用父类引用指向子类对象
a的真实对象是Dog。
如果dog对eat方法overrider了的话,a.eat()调用的是dog的eat(),如果没有则是animal的eat();
栗子:
动物园{
开饭啦(animal[] animals){
foreach(var animal in animals){
animal.eat(new{water,meat});
}
}
}
动物园.开饭啦(new animal[]{new pig(),new dog(),new tigger()});
这种方式略有不同哈。
dog{
public new void eat(){};
}
我这样理解:有很多个子类,通过父类引用指向子类的对象,子类就调用了父类的方法,不用重写,比较简洁方便是嘛
@进击的狗健:
Animal a = new Dog();我创建的对象a是Animal类型的还是Dog类型的?
a的真实对象类型是Dog, 可以通过a.gettype()== typeof(Dog),你看是不是true来判定。
@czd890: 好了 是Dog类型的,我用的是getClass方法和instanceof方法判断出来的,因为我不理解你说的gettype()这个,这是方法吗 。再次感谢
@进击的狗健: java里面是getclass,.net里面是gettype
@czd890: 怪不得我说怎么我打的时候显示没有这个方法,我理解了为什么要这样创建对象了
Animal a = new Dog();我创建的对象a是Animal类型的还是Dog类型的?
答:Animal类型
a.eat();我调用的是Animal的方法还是Dog的?
答:你自己试试好了
在什么情况下使用父类引用指向子类对象
答:这就是面向对象编程的精华之一,如果你想创建扩展性好的程序,针对抽象编程是一个好办法,详情看参见设计模式相关的书或 https://www.oodesign.com/
随便看一本设计模式的书,看透了你就知道这么写的好处了,推荐《headfrist 设计模式》,这本书比较简单
好的 谢谢了 我刚入门
试过了,调用的是Dog的,当Dog继承之后不重写的话,是不会调用Animal的方法的。为什么楼上说a是Dog类型的,怎么验证一下a的类型,有什么方法吗
@进击的狗健: 可以用过GetType
函数查看对象的Type
有以下情况:
一:Dog只继承Animal 此时调用Animal类的eat方法
二:Animal的eat使用virtual关键字 Dog继承Animal并使用override重写eat方法 此时调用Dog中的eat方法
三:Animal的eat使用virtual关键字 Dog继承Animal并使用new关键字 此时调用Animal中的eat方法
四:Dog只继承Animal(Animal中的eat方法没使用任何修饰符) Dog继承Animal 并使用new关键字 此时调用Animal中的eat方法
new Dog();
解释一下new,很多人会忽略 其含义:为类分配堆内存,并且返回对象引用(地址)。
Animal a :这是描述一个引用;那么既然用Animal描述a,那么限定a的操作将是Animal的成员。