3

我创建了一个名为的类,该类Base具有一个存储 a 的字段,UUID因为我希望系统中的所有对象都具有该字段。我还希望在id可以存储在数据库中的所有对象上命名一个字段。我不会添加它,Base因为并非我的域层中的所有对象都将持久保存到数据库中。我可以创建另一个继承Base并添加该字段的类,然后让所有需要的类都继承自该字段。

是否应该避免创建为了添加这样的字段而存在的层次结构?有更好的选择吗?

4

3 回答 3

3

对于非常简单的应用程序,您只能使用继承。但是随着应用程序变得复杂,如果您使用组合,您的类将更加灵活。因此,在接口中定义公共行为、公共字段并要求具有这些公共行为的类来实现它们。为公共接口提供实现,并让您的类将调用委托给实现类。

这是一个例子:

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);
    }
}

在这个简单的例子中,有很多样板代码,但是当您向类中添加更多字段和方法时,这是具有灵活性并避免代码重复的唯一方法。如果您将有更多接口,例如:PayableSendableReturnable并且想要创建一个只有Payable和 has的新类,则Uniqueness使用合适的接口和支持类:仅Uniqueness+UniquenessSupportPayable+ PayableSupport

另一方面,如果使用继承,您将扩展一些需要包含来自Payable,Sendable等的所有方法的 Base 类,以适应所有需求,但您的类需要 onlyPayable并且 has Uniqueness。通过继承,你也可以实现它ReturnableStorable等等。

于 2013-03-20T22:19:27.073 回答
0

这就是继承的真正用途,用于本地化许多不同类之间共有的类属性/行为。您的示例相当简单,但似乎仍然是对继承的合理使用。

于 2013-03-20T22:05:48.500 回答
0

如果 id 所做的只是提供简单的 get/set,我会使用一个接口:IDbEntity 以及 getId() 和可能的 setId() 等方法。

于 2013-03-20T22:08:35.930 回答