按照视频老师所说的依赖倒置原则。程序涉及要依赖于抽象类(父类),而不依赖于具体类(子类)。这样做的一个好处就是程序具有很大的可扩展性。
那直接通过父类建立,然后需要的话用virtual和override不就可以了?那通过子类建立来隐藏父类方法的new岂不是意义不大?有什么不可取代的原因吗?
你可以去看一下老师第二课的代码,你会发现老师实例化的时候是
Dog dog=new Dog();
这个时候就是new,它的引用是派生类的,你引用了之后本来应该使用基类的那个方法,可是在运行的时候派生类用自己的new过的方法把那个替换了;
但是如果是使用虚方法,那么实例化的时候引用就是基类;只不过在运行的时候如果发现实例化的new后面的类型里面有一个override一个virtual的方法,就会去调用那个方法,而不是基类的。不过说到底作为一个初学者我也不知道有什么不可取代的地方~
根据依赖倒置原则,在主程序中调用方法一般用基类来调用,如Pet.Speak(),而不用Dog.Speak,当在基类的方法声明为Virtual虚方法后,调用时会检验基类所指向的派生类的方法是否被override重写,如果被重写则调用的是重写后的方法;使用new隐藏方法时,时在派生类中的方法用new声明。
这个是设计原则,要尽量依赖基类,这就是多态。
设计成多态,就要用override。
单单使用继承重写方法,就用new。
就结果而言应该一样的。但是实例化的类不一样,override是实例了基类,new实例了子类。
使用override可以降低程序耦合,更加推荐啊。
new 用来隐藏基类中的方法,只有通过派生类本身类的引用才能调用出。
override 用来重写基类中的方法,通过基类调用出的是派生类重写后的方法。可以实现多态。
new用来实例化一个类,作用对像是类.Override是重写,作用对像是变量或方法,在继承一个父类的情况下才有意义,将覆盖父类中的变量或方法.