设计模式:继承或组合

时间:2016-06-16 17:40:12

标签: oop inheritance design-patterns composition

我有2个A和B类,它们都有X和Y属性;但是B类还有另一个属性Z.A类和B类彼此完全无关,它们只共享属性X和Y.

继承

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

class B : A
{
    public int Z;
}

B类与A类没有“is-a”关系,因此它打破了继承主体是OOP。

组合物

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

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

B类与A类没有“has-a”关系,所以它打破了合成主体是OOP。

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

3 个答案:

答案 0 :(得分:0)

很难说一切都是如此抽象而且定义不明确,但一般来说,你应该在有意义的时候使用继承,而不是在它没有的情况下使用继承,在有意义的时候使用组合,而不是在它没有的时候

如果A和B真的没有关系,那么以不同的方式构造事物可能更有意义,你想要的东西在A和B使用或继承的自己的类中是常见的:

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 :(得分:0)

  1. 由于 B类与A类没有“has-a”关系.. 所以不应该使用“组合”。

  2. 您可以按照自己设计的方式使用OOP继承方式。正如你所说,它并没有违反OOP原则。 A级和A级B不是100%无关。它们具有共同的属性,因此OOP继承方式是可以接受的。 请记住,OOP不需要继承Method成员。

  3. 但是你的情况。你应该复制属性声明,这样一个类的更改不会影响另一个。

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

答案 2 :(得分:0)

这完全取决于你的意思"他们只是共享属性XY"。

这两个属性都是公共属性,因此它们对类的行为有贡献。因此,如果属性真的相同(具有相同的语义),我会 说这些类是无关的。它们共享一些行为,因此使用继承或更好的组合是有意义的,在大多数情况下应该优先考虑。

但是,假设AB不相关,则属性更可能只是您为其指定相同名称的相同类型的无关变量。因此,只需重命名其中一个类中的属性,很明显属性和类都是无关的。