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;
}
}
}