0

これは私の前の質問の拡張です:継承による型安全性

古い質問を更新する代わりに、新しい質問を作成しました。これは、このトピックをさらに深く掘り下げているためです。

私の本来の目的は、実装クラスタイプのオブジェクトを返すメソッドを宣言することでした。そのような方法の1つGetSimpleClone()は、次のようになります。

IEntityメソッドを宣言するベースインターフェイスがGetSimpleClone()あり、たとえば、他のいくつかのインターフェイスによって実装されていますIPerson

public interface IEntity<T> : where T : IEntity<T>
{
   T GetSimpleClone();
}

public interface IPerson : IEntity<IPerson>
{
}

インターフェイスIAddressはも実装しIEntityます。ただし、別のインターフェイスIVenueはから継承しIAddressます。最初に説明したように、のGetSimpleClone()メソッドIAddressは型のオブジェクトを返しIAddress、同じメソッドはIVenue型のオブジェクトを返す必要がありますIVenue。したがって、の宣言は、ジェネリック型自体を宣言する必要があるため、とはIAddress異なります。IPerson

public interface IAddress<T> : IEntity<T> where T : IAddress<T>
{   
}

public interface IVenue : IAddress<IVenue>
{
} 

ここで問題となるのは、コンパイラIPersonへの参照がIAddressあり、当然のことながら、コンパイラがのジェネリック型を定義するように強制することですIAddress

public interface IPerson : IEntity<IPerson>
{
   IAddress<"Compiler: Define Type!!"> Address { get; set; }
}

私は本当にこの問題の解決策を見つけることができません、そしてそれが単に解決策がないと言っているだけであるとしても、あなたからの助けをいただければ幸いです。:)

前もって感謝します...

4

1 に答える 1

1

これを実現するには、さらに別のジェネリックを導入する必要があります。

public interface IPerson<T> : IEntity<IPerson<T>>
    where T : IAddress<T>
{
   IAddress<T> Address { get; set; }
}

私が考えることができるより良い解決策は、安全性を脇に置き、のIAddressような一般的な方法で優れたベースインターフェイスを作成し、それを必要なgetAddressStringすべてのタイプのアドレスに使用することです。

于 2013-03-03T16:26:38.323 に答える