我正在阅读“头第一设计模式”,在第一章中,作者试图解释一种设计方法。他首先展示了一个问题,然后尝试使用设计模式来解决它。
假设我有一个Duck基类:
class Duck
{
swim();
quack();
display();
}以及派生类RubberDuck,
class RubberDuck : Duck
{
quack(); //override to nothing
}他说,如果RubberDuck不嘎嘎的话,我必须把它重写为零。为什么?
我认为,简单地说,如果RubberDuck不庸俗,我就不会将它添加到RubberDuck中。所以不会有覆盖,就像:
class RubberDuck : Duck
{
//other methods
}他说:所以我们知道使用继承的效果不是很好,因为鸭子的行为在子类之间不断变化,而且并不是所有的子类都有这些行为。
为什么?
如果我不覆盖任何方法,我将不会调用在代码中实现子类对象的方法。我的意思是,如果我不使用任何能力,这意味着我没有这种能力,有什么问题吗?
发布于 2014-03-05 09:34:29
如果不重写方法,则该方法将从基类继承。因此,RubberDuck将像Duck一样实现quack。
这正是继承的目的。否则,它的用途是什么?
如果您重写一个方法,如果您仍然希望与基类具有相同的行为,则必须调用base.Quack()。不覆盖该方法与以下内容相同:
public void Quack()
{
base.Quack();
}因此,重写该方法的唯一原因是更改或扩展它。
聚合的行为可能更符合您的预期,例如:
public interface IDuck
{
void Quack();
}
public class RubberDuck : IDuck
{
private readonly Duck duck = new Duck();
public void Quack()
{
this.duck.Quack();
}
}与:
public class RubberDuck : IDuck
{
public void Quack()
{
// not doing anything, but we still need to implement the method since it's defined by IDuck
}
}发布于 2014-03-05 09:38:49
在这本书中,只有display()方法是抽象的,基类为所有其他方法(如quack()、swim()等)提供默认实现。
class Duck
{
swim() {
// do some swimming
}
quack() {
// do some quacking
}
abstract display();
}发布于 2014-03-05 09:41:42
您应该知道java中没有多重继承,所以如果您从rubbercock扩展另一个子类,并且如果子类quaks,那么它应该在rubbercock中被覆盖,否则子类必须定义一个新的quak方法,但是不能从rubbercock继承/重写它。
https://stackoverflow.com/questions/22193698
复制相似问题