我有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的原则)还是有其他设计模式?我个人认为,由于可读性,使用继承将是邪恶中的较小者。
答案 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)
由于 B类与A类没有“has-a”关系.. 所以不应该使用“组合”。
您可以按照自己设计的方式使用OOP继承方式。正如你所说,它并没有违反OOP原则。 A级和A级B不是100%无关。它们具有共同的属性,因此OOP继承方式是可以接受的。 请记住,OOP不需要继承Method成员。
但是你的情况。你应该复制属性声明,这样一个类的更改不会影响另一个。
class A
{
public int X;
public int Y;
}
class B
{
public int X;
public int Y;
public int Z;
}
答案 2 :(得分:0)
这完全取决于你的意思"他们只是共享属性X
和Y
"。
这两个属性都是公共属性,因此它们对类的行为有贡献。因此,如果属性真的相同(具有相同的语义),我会 不 说这些类是无关的。它们共享一些行为,因此使用继承或更好的组合是有意义的,在大多数情况下应该优先考虑。
但是,假设A
和B
不相关,则属性更可能只是您为其指定相同名称的相同类型的无关变量。因此,只需重命名其中一个类中的属性,很明显属性和类都是无关的。