设计模式:继承或组合

Design Pattern: Inheritance or Composition

我有 2 classes A 和 B,它们都有属性 X 和 Y;但是 class B 也有另一个 属性,Z。Classes A 和 B 彼此完全无关,它们只是共享属性 X 和 Y。

继承

class A
{
    public int X;
    public int Y;
}

class B : A
{
    public int Z;
}

Class B 与 class A 没有 "is-a" 关系,因此它打破了 OOP 的继承原则。

作文

class A
{
    public int X;
    public int Y;
}

class B
{
    public A ObjA;
    public int Z;
}

Class B 与 class A 没有 "has-a" 关系,因此它破坏了 OOP 的组合原则。

如果没有重复代码,我应该使用继承或组合(即使它们破坏了 OOP 的原则)还是有其他设计模式?我个人认为,由于可读性,使用继承将是弊中取其轻。

很难说一切都如此抽象和不明确,但一般来说,你应该在有意义的时候使用继承,而不是在没有意义的时候,在有意义的时候而不是在没有意义的时候使用组合't.

如果 A 和 B 确实没有任何关系,那么以不同的方式构建事物可能更有意义,您想要的东西在 A 和 B 所使用或继承的 class 中共有:

class hasXY {
    int X;
    int Y;
}

class A : hasXY { }
class B : hasXY { int Z }

class A {
    hasXY  XY;
}
class B {
    hasXY  XY;
    int    Z;
}

当然,这会在某些语言中引入额外的开销(取决于它们的实现细节)

  1. 因为 Class B 与 class A 没有 "has-a" 关系 .. 所以不应使用“Composition”。

  2. 您可以按照您设计的方式使用 OOP 继承方式。它不会像您所说的那样违反 OOP 原则。 Class A 和 B 并非 100% 无关。它们具有共同的属性,因此 OOP 继承方式是可以接受的。 请记住,OOP 不需要继承方法成员。

但是您的 case.You 应该复制属性声明,这样 class 的更改不会影响另一个。

class A
{
    public int X;
    public int Y;
}

class B
{
    public int X;
    public int Y;
    public int Z;
}

这完全取决于你所说的 "they just share properties X and Y" 是什么意思。

这两个属性都是 public,因此它们有助于 class 的行为。因此,如果属性真的相同(具有相同的语义),我会 而不是 说 class 是不相关的.它们共享一些行为,因此使用继承或更好的组合是有意义的,在大多数情况下应该是首选。

但是当您假设 AB 不相关时,更有可能的是这些属性只是您为其分配了相同名称的相同类型的不相关变量。因此,只需重命名其中一个 classes 中的属性,就会清楚这些属性和 classes 是无关的。