0

これはおそらく簡単な質問ですが、これまでのところ解決策を見つけることができませんでした...

他のいくつかのインターフェースによって実装されているインターフェース「IEntity」があるとしましょう。私が欲しいのは、これらの各インターフェースが、それ自体の戻り型を持つメソッドを実装することです。たとえば、エンティティ「Car」は「ICar」を返し、エンティティ「Person」は「IPerson」を返す必要があります。この機能をジェネリック型で実装しようとしましたが、本当に受け入れられる解決策が見つかりませんでした。

よろしくお願いします。

4

4 に答える 4

1

ジェネリックスを使用すると、これをかなり簡単に行うことができますが、コードはどこかで処理され、IEntityコンパイル時に基になるジェネリック型について知らないと思います。もしそうなら、あなたはそのように2つのインターフェースを宣言することができます:

public interface IEntity<T> : IEntity
{
    new T GetThis();
}

public interface IEntity
{
    object GetThis();
}

次に、次のCarようになります。

public class Car : ICar, IEntity<ICar>
{
    public ICar GetThis()
    {
        Console.WriteLine("Generic GetThis called");
        return this;
    }

    object IEntity.GetThis()
    {
        Console.WriteLine("Non-generic GetThis called");
        return this;
    }
}

これは明示的なインターフェイスの実装を使用するため、呼び出し元のコードがそれが(というよりも)であることがわかっている場合は、汎用バージョンを利用します。それがそれをとしてのみ知っている場合、それは非ジェネリックバージョンを活用します。CarIEntity<ICar>IEntity

したがって、これを活用する可能性のあるいくつかのコード:

public static T SomeMethod<T>(IEntity<T> entity)
{
    T target = entity.GetThis(); //Generic GetThis called
    return target;
}

public static object SomeNonGenericMethod(IEntity entity)
{
    object target = entity.GetThis(); //Non-generic GetThis called
    return target;
}

Car car = new Car();
ICar icar = SomeMethod<ICar>(car);

IEntity someEntity = new Car();
object obj = SomeNonGenericMethod(someEntity);
于 2013-03-03T13:51:16.807 に答える
1

これを行う通常の方法は、「繰り返しテンプレート パターン」を使用することです。

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

エンティティ タイプは、独自のタイプをジェネリック パラメータとして使用して、このインターフェイスを実装しますT

public class Car : IEntity<Car>
{
    Car GetSelf() { return this; }
}
于 2013-03-03T13:50:19.350 に答える
1

あなたが何を求めているのか完全にはわかりませんが、これは近いように聞こえ、シンプルです。

interface IEntity<T>
{
    T Value { get; }
}

class Car : IEntity<ICar>
{
    ICar Value { get; }
}

class Person : IEntity<IPerson>
{
    IPerson Value { get; }
}

もっと複雑なものが必要ですか?

于 2013-03-03T13:50:27.647 に答える
0

派生インターフェースのメソッドによって返されるすべての可能なタイプのスーパークラスである、原因のメソッドの戻りタイプを追加するだけです。あなたの場合:

interface IEntity {
  IEntity SomeMethod();
}
于 2013-03-03T13:52:49.163 に答える