7

これは本当に単純なことですが、インターフェースに関しては、継承の悪意に頭を悩ませることに苦労しています。

次のクラスがある場合、基本メソッドをオーバーライドせずに、クラスParentに固有のインターフェイスでGetメソッドをインターフェイスするにはどうすればよいですか?

public class Base<T, T2>
{
    public T Get<T, T2>(string key)
    {
        ...
    }
}

public class Parent : Base<Type1, Type2>, IParent
{
    ...
}

これが私が持っているatmですが、「インターフェイスメンバーType1 IParent.Get(string)が実装されていません」というエラーが発生し続けます。

public interface IParent
{
    Type1 Get(string key);
}
4

5 に答える 5

5

public T Get<T, T2>(string key)ジェネリッククラスにジェネリックメソッドを作成します。Tとはこのジェネリックメソッドの引数になり、クラスとT2とは関係ありません。TT2

ただそれを作ってpublic T Get(string key)ください。

于 2013-01-02T16:11:45.667 に答える
2

T Get<T,T2>(string)メソッドBase<T,T2>とのメソッドType1 Get(string)メソッドはIParent、2つの異なるメソッドシグネチャです。両方を実装する必要があります。両方の実装で同じ機能を使用する場合は、次のようにします。

public class ParentJ : Base<Type1, Type2>, IParent {
 public Type1 Get(string key) {
    return this.Get<Type1,Type2>(key);
 }
}

Get()ただし、元々の目的はメソッドをパラメーター化することではないと思います。Base<T,T2>したがって、次のBaseように記述します。

public class Base<T,T2> {
  public T Get(string key) {
    // implementation here
  }
}

そのシグニチャは、のメソッドシグニチャを満たしIParentます。

メソッドを含むクラスによって型を推測できない、または推測すべきでない場合にのみ、メソッドに型パラメーター(Tおよび)が必要です。T2

于 2013-01-02T16:14:41.827 に答える
2

メソッドを照合する場合、このシグニチャは完全に一致する必要があります。シグニチャのコンポーネントの1つは、ジェネリック引数の数です。

インターフェイスには、型引数がゼロIParentのメソッドが含まれています。Getクラスには、 2つの型引数を持つBaseメソッドが含まれています。Get

型引数を共有しているように見えBase.Getますが、そうではありません。使用されている構文は、クラスの型引数をシャドウする2つの新しい型引数を作成します。

修正は、型引数を持たないGetメソッドを単純に実装することです。Parent

于 2013-01-02T16:15:24.720 に答える
1

これを試して。ベースをオーバーライドせずにGet、を実装しIParentます。

public class Type1 { }
public class Type2 { }

public interface IParent
{
    Type1 Get(string key);
}

public class Base<T, T2> 
{
    public T Get(string key)
    {
        return default(T);
    }
}
public class Parent : Base<Type1, Type2>, IParent
{
}
于 2013-01-02T16:17:49.620 に答える
0

一般的なIParentインターフェースを使用してみてください。

于 2013-01-02T17:33:55.483 に答える