我创建了一个名为的类,该类Base
具有一个存储 a 的字段,UUID
因为我希望系统中的所有对象都具有该字段。我还希望在id
可以存储在数据库中的所有对象上命名一个字段。我不会添加它,Base
因为并非我的域层中的所有对象都将持久保存到数据库中。我可以创建另一个继承Base
并添加该字段的类,然后让所有需要的类都继承自该字段。
是否应该避免创建为了添加这样的字段而存在的层次结构?有更好的选择吗?
我创建了一个名为的类,该类Base
具有一个存储 a 的字段,UUID
因为我希望系统中的所有对象都具有该字段。我还希望在id
可以存储在数据库中的所有对象上命名一个字段。我不会添加它,Base
因为并非我的域层中的所有对象都将持久保存到数据库中。我可以创建另一个继承Base
并添加该字段的类,然后让所有需要的类都继承自该字段。
是否应该避免创建为了添加这样的字段而存在的层次结构?有更好的选择吗?
对于非常简单的应用程序,您只能使用继承。但是随着应用程序变得复杂,如果您使用组合,您的类将更加灵活。因此,在接口中定义公共行为、公共字段并要求具有这些公共行为的类来实现它们。为公共接口提供实现,并让您的类将调用委托给实现类。
这是一个例子:
interface Uniqueness {
long getUUID();
void setUUID(long uuid);
}
interface Storable {
long getId();
void setId(long id);
}
class UniquenessSupport implements Uniqueness {
private long uuid;
@Override
public long getUUID() {
return uuid;
}
@Override
public void setUUID(long uuid) {
this.uuid = uuid;
}
}
class StorableSupport implements Storable {
private long id;
@Override
public long getId() {
return id;
}
@Override
public void setId(long id) {
this.id = id;
}
}
class Some implements Uniqueness, Storable {
private UniquenessSupport uniquenessSupport;
private StorableSupport storableSupport;
public Some() {
uniquenessSupport = new UniquenessSupport();
storableSupport = new StorableSupport();
}
@Override
public long getUUID() {
return uniquenessSupport.getUUID();
}
@Override
public void setUUID(long uuid) {
uniquenessSupport.setUUID(uuid);
}
@Override
public long getId() {
return storableSupport.getId();
}
@Override
public void setId(long id) {
storableSupport.setId(id);
}
}
在这个简单的例子中,有很多样板代码,但是当您向类中添加更多字段和方法时,这是具有灵活性并避免代码重复的唯一方法。如果您将有更多接口,例如:Payable
,Sendable
,Returnable
并且想要创建一个只有Payable
和 has的新类,则Uniqueness
使用合适的接口和支持类:仅Uniqueness
+UniquenessSupport
和Payable
+ PayableSupport
。
另一方面,如果使用继承,您将扩展一些需要包含来自Payable
,Sendable
等的所有方法的 Base 类,以适应所有需求,但您的类需要 onlyPayable
并且 has Uniqueness
。通过继承,你也可以实现它Returnable
,Storable
等等。
这就是继承的真正用途,用于本地化许多不同类之间共有的类属性/行为。您的示例相当简单,但似乎仍然是对继承的合理使用。
如果 id 所做的只是提供简单的 get/set,我会使用一个接口:IDbEntity 以及 getId() 和可能的 setId() 等方法。