0

我有一个接口Schema,另一个叫SchemaParser. SimpleSchemaParser实现SchemaParserSimpleSchema实现Schema

SimpleSchemaParser有一个parseSchema()返回 a的方法Schema。这样,SimpleSchemaParser.parseSchema()将返回一个Schema对象。但我知道那SimpleSchemaParser总是会返回一个SimpleSchema. 我应该如何更改我的设计以使这一点变得明显,而不是总是必须将结果转换为SimpleSchema?在这种情况下我应该选择仿制药吗?

4

3 回答 3

3

您确实可以使用泛型,但它们不是必需的:

class SchemaExample 
{
    interface Schema 
    {
        // methods go here
    }

    interface SchemaParser 
    {
        Schema parseSchema();
    }

    class SimpleSchema implements Schema 
    {
        // implementation of Schema's methods
    }

    class SimpleSchemaParser implements SchemaParser 
    {
        @Override
        public SimpleSchema parseSchema() 
        {
            // real business logic here...
            return new SimpleSchema();
        }   
    }

    void usage() 
    {
        SimpleSchema schema = new SimpleSchemaParser().parseSchema();
    }
}

一个稍微宽泛的问题是:你为什么关心返回的是哪个模式的实现?是否存在仅存在于 上的方法SimpleSchema?这些可以移动到界面Schema吗?

于 2012-07-05T07:51:51.963 回答
3

从 java 5 开始,您可以返回 SimpleSchema。这称为“协变返回类型覆盖”。

所以就写

class SimpleSchemaParser implements SchemaParser {
  @Override
  public SimpleSchema parseSchema() {...}
}
于 2012-07-05T07:53:21.317 回答
2

目前的做法是对的。它鼓励面向接口的编程:程序应该始终与实体 SchemaParser 和 Schema 一起工作,而不用担心它是基于 SimpleSchema 还是其他类型。如果接口设计良好,则不需要强制转换:接口方法是唯一应该使用/调用的方法。

SchemaParser parser = new SimpleSchemaParser()
Schema schema = parser.parseSchema()
于 2012-07-05T08:04:10.420 回答