Language agnostic 使用继承的一些容易理解的坏例子是什么?

Language agnostic 使用继承的一些容易理解的坏例子是什么?,language-agnostic,inheritance,Language Agnostic,Inheritance,我正在寻找使用继承的坏例子。我不是很有创意,所以这是我能想到的最好的: class Car : public Engine {} 汽车有发动机,但它不是发动机 这也许可以解释这个概念,但我相信还有更多的例子可以说明?经典的例子;-): 堆栈不是向量 如果堆栈扩展了向量,则可以在每个给定索引处插入/删除元素,而只允许通过推/弹出来添加/删除元素。继承非常有用,但也会破坏封装。这意味着子类依赖于超类的实现细节;如果超类更改,子类可能会中断。下面是一个Java示例,摘自Josh Bloch的《高效J

我正在寻找使用继承的坏例子。我不是很有创意,所以这是我能想到的最好的:

class Car : public Engine {}
汽车有发动机,但它不是发动机

这也许可以解释这个概念,但我相信还有更多的例子可以说明?

经典的例子;-):

堆栈不是向量


如果堆栈扩展了向量,则可以在每个给定索引处插入/删除元素,而只允许通过推/弹出来添加/删除元素。

继承非常有用,但也会破坏封装。这意味着子类依赖于超类的实现细节;如果超类更改,子类可能会中断。下面是一个Java示例,摘自Josh Bloch的《高效Java》:

public class InstrumentedHashSet<E> extends HashSet<E> {

   // number of attempted element insertions
   private int addCount = 0;

   public int getAddCount() {
      return addCount;
   }

   @Override public boolean addAll<Collection<? extends E> c) {
       addCount += c.size();
       return super.addAll(c);
   }
}
公共类InstrumentedHashSet扩展了HashSet{
//尝试插入元素的次数
私有int addCount=0;
public int getAddCount(){
返回addCount;
}

@覆盖公共布尔addAll这已经争论了很多年,你会在谷歌上找到很多关于这个问题的材料/谈话

public class Square extends Rectangle { 
    ...
}

也许这并不奇怪,正方形不应该从矩形继承。

使用几乎所有使用继承而不考虑基类行为的示例

一个典型的例子是
正方形
矩形
之间的关系。当然,在数学中,正方形是矩形的一种。但是,在软件设计中,正方形的行为与矩形不同:

public class Rectangle 
{
    public virtual int Width  { get; set; }
    public virtual int Height { get; set; }
}

public class Square : Rectangle
{
    public override int Width
    {
        get { return base.Width; }
        set
        {
            base.Width = value;
            base.Height = value;
        }
    }

    public override int Height
    {
        get { return base.Height; }
        set
        {
            base.Height= value;
            base.Width = value;
        }
    }
}

如果另一个类,
Client
,需要一个
矩形
,但得到了一个
正方形
Client
将崩溃,因为它希望它的
矩形
有一个彼此不影响的
宽度
高度

我认为有无数错误的事情可以做。而且,int投票问题到此结束。我认为这是一个好问题,因为它可以帮助新手避免愚蠢的OOP错误。这只是因为矩形是可变的。我同意李的观点——从抽象意义上讲,正方形
是一个
矩形,只有你特定的实现才使它无效。杰夫:你可以这样修改合同客户不希望
宽度
高度
对彼此没有影响。我也同意Lee的观点。这只是我在几本面向对象的书中看到的一个例子。在每种情况下,作者都会将不变性排除在例子之外。(很抱歉反应太晚。)我在谷歌上找不到好的例子,这就是我为什么要问的原因。@maftrect这里的特殊问题,我的意思是。我还没有看到一个不是矩形的正方形。你能给我画一个吗?@Gabe在现实世界中,当然。在OO中,不。你会遇到麻烦的简单解释是:不,为什么OO不需要模拟现实世界?在现实世界中,更改矩形的大小将为您提供一个不同的矩形。只需使您的实现不允许您更改现有矩形的大小。或者更改合同,以便客户端知道可能存在大小或纵横比限制。
public class Square extends Rectangle { 
    ...
}
public class Rectangle 
{
    public virtual int Width  { get; set; }
    public virtual int Height { get; set; }
}

public class Square : Rectangle
{
    public override int Width
    {
        get { return base.Width; }
        set
        {
            base.Width = value;
            base.Height = value;
        }
    }

    public override int Height
    {
        get { return base.Height; }
        set
        {
            base.Height= value;
            base.Width = value;
        }
    }
}