伙计们正在搜索组成和继承之间的区别然后我在某个地方找到了这篇文章。
根据帖子组成比代码重用中的继承更好。
class Fruit {
// Return int number of pieces of peel that
// resulted from the peeling activity.
public int peel() {
System.out.println("Peeling is appealing.");
return 1;
}
}
class Apple {
private Fruit fruit = new Fruit();
public int peel() {
return fruit.peel();
}
}
class Example2 {
public static void main(String[] args) {
Apple apple = new Apple();
int pieces = apple.peel();
}
}
更改后端类
class Peel {
private int peelCount;
public Peel(int peelCount) {
this.peelCount = peelCount;
}
public int getPeelCount() {
return peelCount;
}
//...
}
class Fruit {
// Return int number of pieces of peel that
// resulted from the peeling activity.
public Peel peel() {
System.out.println("Peeling is appealing.");
return new Peel(1);
}
}
//必须更改Apple才能容纳 //对水果的改变
class Apple {
private Fruit fruit = new Fruit();
public int peel() {
Peel peel = fruit.peel();
return peel.getPeelCount();
}
}
// Example2的这个旧实现 //仍然可以正常工作。
class Example1 {
public static void main(String[] args) {
Apple apple = new Apple();
int pieces = apple.peel();
}
}
这是我根据帖子得到的结果是“如果后端类的界面发生变化,前端类的实现也会改变而不是它的界面”。
界面这里有什么实施?
这只是我的假设,只要我错了?(可能一切都错了)。
后端类是接口,因为前端类取决于它吗?
前端类的实现是前端类中的实现代码吗?
前端类也是接口,因为示例中的代码取决于吗?
他们 lousely耦合,因为更改后端界面没有更改前端界面?因此,依赖于前端界面的代码仍然有效。
如果我使用继承而不是子类紧密耦合在超类中?因为对超类的更改也会更改为子类,因此依赖于子类的代码可能不起作用。
Wny继承是弱封装。
答案 0 :(得分:2)
This是应该在Apple和Fruit之间进行的直观继承关系。但是,这是不以上示例所做的事情。
以上示例使用的是合成,这意味着Fruit
<{em> Apple
的一部分(参见uml here)。这非常违反直觉!在这种情况下,Fruit
和Apple
都有剥离的单独实现。 peel()
中Apple
的实施使用Fruit.peel()
。
我认为要点是,如果Apple
使用与Fruit
的合成关系,那么它的实现可以独立于Fruit。例如,我可以使用其他一些实现,而不是使用Fruit.peel()
来获取Apple.peel()
的计数。但如果Apple
继承Fruit
,则Fruit
的更改也会更改Apple
。因此Apple
并非独立于Fruit
,因此我们说它是紧密耦合的。
这在几个方面都是一个不好的例子,1)我们都知道苹果是水果,所以继承似乎是最正确的实现。 2)继承似乎是实现事物的最 DRY 方式,因为使用组合要求您更正Apple
类,以便在更改为Fruit
时执行相同的操作致Fruit.peel()
。
编辑:阅读完文章后,我觉得重点是概述使用继承的缺陷。使用继承正确没有任何问题。仅仅为了代码重用而使用它可能会导致问题,如果子类没有真正从超类继承行为。
回答您的问题!
后端类是接口,因为前端类依赖于 它?
足够近。所有课程都有“界面”。这并不意味着它们在类声明中确实具有implements IFruit
,它只是引用对象的形状 - 对象具有哪些方法,无论这些方法如何工作。
是前端类的实现代码 在前端课堂内?
粗略地说,是的。构成类中方法主体的代码的实际逻辑是类的实现。
前端类也是一个接口,因为示例中的代码 取决于它?
差不多。 Apple
隐式地具有一个接口,就像任何其他类一样。如果Example
使用Apple
类,那么它只能通过使用属于接口的方法来实现。
它们是否因为改变到后端界面而没有耦合 改变前端界面?
是的,这是使用“松散耦合”这一短语的一种方式。
如果我使用继承而不是紧密耦合的子类 超类?因为更改为超类也将更改为子类 所以依赖于子类的代码可能不起作用。
是的,这是对的。这两个类是紧密耦合的,因为它们的行为并不完全封装在每个单独的类中。这并不总是错的,这取决于具体情况。
Wny继承是弱封装。[原文如此]
因为行为是在超类和子类之间共享的。