0

私はインターフェースを持っておりSchema、別のインターフェースはSchemaParserSimpleSchemaParser実装SchemaParserおよびSimpleSchema実装しSchemaます。

SimpleSchemaParserparseSchema()を返すメソッドがあります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 に答える