组合和继承是一样的吗? 如果我想实现组合模式,我应该如何在Java中实现?
组合和继承是一样的吗? 如果我想实现组合模式,我应该如何在Java中实现?
继承是指一个类继承另一个类,建立了“是一个”关系。
另一方面,组合是指在一个类中包含另一个类的实例,建立了“有一个”关系。在Java中,组合非常有用,因为它在技术上实现了多重继承。
继承 vs 组合。
继承和组合都用于类行为的可重用性和扩展。
继承主要用于家族算法编程模型,例如 IS-A 关系类型表示相似类型的对象。例如:
这些都属于汽车家族。
组合表示 HAS-A 关系类型。它显示对象的能力,例如 Duster 有五档,Safari 有四档等。每当我们需要扩展现有类的功能时,就使用组合。例如,如果我们需要在 Duster 对象中添加一个更多的齿轮,则必须创建一个新的齿轮对象并将其组合到 Duster 对象中。
我们不应该在基类中进行更改,除非所有派生类都需要这些功能。对于这种情况,我们应该使用组合。例如:
类 A 派生自类 B
类 A 派生自类 C
类 A 派生自类 D。
当我们在A类中添加任何功能时,即使C类和D类不需要这些功能,它也对所有子类可用。为了处理这种情况,我们需要为这些功能创建一个单独的类,并将其组合到所需的类中(这里是B类)。 // This is a base class
public abstract class Car
{
//Define prototype
public abstract void color();
public void Gear() {
Console.WriteLine("Car has a four Gear");
}
}
// Here is the use of inheritence
// This Desire class have four gears.
// But we need to add one more gear that is Neutral gear.
public class Desire : Car
{
Neutral obj = null;
public Desire()
{
// Here we are incorporating neutral gear(It is the use of composition).
// Now this class would have five gear.
obj = new Neutral();
obj.NeutralGear();
}
public override void color()
{
Console.WriteLine("This is a white color car");
}
}
// This Safari class have four gears and it is not required the neutral
// gear and hence we don't need to compose here.
public class Safari :Car{
public Safari()
{ }
public override void color()
{
Console.WriteLine("This is a red color car");
}
}
// This class represents the neutral gear and it would be used as a composition.
public class Neutral {
public void NeutralGear() {
Console.WriteLine("This is a Neutral Gear");
}
}
继承意味着重用类的完整功能,这里我的类必须使用超类的所有方法,我的类将与超类紧密耦合,并且在继承的情况下代码将在两个类中重复。
但是当我们使用组合来与另一个类交互时,我们可以克服所有这些问题。组合是将另一个类的属性声明为我的类,以便我们想要与其交互。我们可以通过使用该属性获得所需的功能。
组合意味着创建一个与特定类有关系的对象。 假设学生与账户有关系;
继承是指具有扩展功能的先前类。这意味着这个新类是旧类带有一些扩展功能。 假设学生是学生,但所有学生都是人类。因此,学生和人之间存在关系。这就是继承。
不是,两者是不同的。组合遵循“HAS-A”关系,而继承遵循“IS-A”关系。组合的最佳示例是策略模式。