4

なぜこれが不可能なのですか?

abstract class A
{
    public abstract T f<T>();
}

class B<T> : A
{
    public override T f()
    {
        return default (T);
    }
}

エラー:

does not implement inherited abstract member 'A.f<T>()'
no suitable method found to override

署名が同じでなければならないことはわかっていますが、私の観点からは、これが禁止されている理由がわかりません。また、別の解決策はA、そのメソッドではなくジェネリックにすることであることは知っていますが、何らかの理由で私には適していません。

4

5 に答える 5

5

これらのメソッドには異なる署名があるため、これは不可能です。A.fはジェネリック メソッドであり、B.fそうではありません (クラス ジェネリック引数を使用するだけです)。

このフォームの発信者の視点を見ることができます:

A variableA = new A();
variableA.f<int>();

B<int> variableB = new B<int>();
variableB.f();
于 2013-01-11T09:10:39.720 に答える
4

Bの契約を履行しませんA

A任意fの型パラメーターを指定して呼び出して、その型を返すことができます。B型パラメーターを指定して呼び出すことはできず、 のf型パラメーターの型を返すだけBです。

たとえば、 があり、B<int>それを にキャストしたとしますA(それは継承されているため、可能なはずです)。次に、それを呼び出しf<bool>()ました( であるため、これは可能であるはずですA)。じゃあ何?基になるB<int>には、呼び出すメソッドがありません。

B b = new B<int>();
// This is legal as B inherits from A
A a = b;
// This is a legal call, but how does b handle it?
bool result = a.f<bool>();
于 2013-01-11T09:12:22.240 に答える
1

あなたのコードの場合

abstract class A
{
    public abstract T f<T>();
}

class B<T> : A
{
    public override T f()
    {
        return default (T);
    }
}

以下のコードで何と呼ばれると思いますか

public void Foo(A myObj) {
    myObj.f<DateTime>();
}
Foo(new B<int>());

型コントラクト (抽象クラス A) は、実装が必要であることを明確に示していますが、そのメソッドの実装はありません。したがって、クラス レベルで型引数を使用するようにコントラクトを実装または変更できます。

abstract class A<T>
{
    public abstract T f();
}

class B<T> : A<T>
{
    public override T f()
    {
        return default (T);
    }
}

コンパイルしますが、もちろん f も制限します

于 2013-01-11T09:13:48.937 に答える
0

おそらくこれはあなたがやろうとしていることです:

abstract class A
{
    public abstract T f<T>();
}

class B<U> : A
{
    public override T f<T>() //also needs to have a generic type parameter
    {
        throw new NotImplementedException();
    }

    public U f()
    {
        return f<U>();
    }
}

ジェネリック メソッド型パラメーターとジェネリック クラス型パラメーター (ここではTU) には直接的な関係Tはありません。つまりU、基本クラスで (または何か) に制限されておらず、派生クラスでこの制限を変更することはできません。

于 2013-01-11T09:12:13.910 に答える
0
abstract class A
{
    public abstract T f<T>();
}

class B<T> : A
{
    public override T f<T>()
    {
        return default (T);
    }
}
于 2013-01-11T09:13:49.980 に答える