1

私はクラスの階層を持っています:

class A{}
class B: A {}
class C:B {}

クラスAにメソッドを実装することは可能ですか?派生クラスBおよびCなどに継承され、そのメソッドはクラス型の値を返す必要がありますか?

A val = A.method(); (val is A)
B val = B.method(); (val is B)
C val = C.method(); (val is C)

そして、このメソッドの呼び出しでジェネリックを使用したくありません。つまり、

C val = C.method<C>();

皆さん、すみません、1 つ詳しく説明します。このメソッドは静的でなければなりません。

メソッド istelf でジェネリックを使用したくないのは、メソッドが返す必要がある型を強制するのに対し、メソッドはそのクラスの型を返す必要があるためです。

class A
    {
      Method<T>()
      {
         T result;
         return result;
      }
    }

そのようなメソッドがあれば、戻り値の型を変更できます:

D result = A.Method<D>();

しかし、型 A の値を返すようにしたかったのです。

4

3 に答える 3

3

いいえ、それはできません。

そのようにメソッドを呼び出すには、静的でなければならず、静的メソッドは継承されません。

を使用B.method()して静的メソッドを呼び出すことは、を使用することAと同じA.method()です。Aコンパイラは型を使用してメソッドがどこにあるかを判断するだけですが、メソッドがorB型を使用して呼び出されたかどうかを知ることは不可能です。

于 2012-05-28T15:30:32.247 に答える
2

C++ のいくつかの設計パターンを使用すると、これが簡単になります。

class A
{
    protected virtual A method_impl() { return new A(); }
    public A method() { return method_impl(); }
}

class B : A
{
    protected override A method_impl() { return new B(); }
    public new B method() { return (B)method_impl(); }
}

class C : B
{
    protected override A method_impl() { return new C(); }
    public new C method() { return (C)method_impl(); }
}

もちろん、これとまったく同じ問題が C++ では発生することはありません。C++ では、オーバーライドの共変の戻り値の型が許可されます。


別の方法として、IoC パターンを使用します。

class A
{
    protected virtual void method_impl(A a) { a.initialize(); }
    public A method() { A result = new A(); method_impl(result); return result; }
}

class B : A
{
    public new B method() { B result = new B(); method_impl(result); return result; }
}

class C : B
{
    public new C method() { C result = new C(); method_impl(result); return result; }
}
于 2012-05-28T14:59:43.753 に答える
2

拡張メソッドを使用します。

class Program
    {
        static void Main(string[] args)
        {
            B x = new B();
            x.Method();
        }
    }

    public static class Ext
    {
        public static T Method<T>(this T obj)
            where T : A,new()
        {
            return new T();
        }
    }

    public class A
    {

    }

    public class B : A
    {

    }

またはそのバリエーション。指定した型のインスタンスを作成できるパブリック メンバーが必要であることに注意してください。説明すると、コンパイラは型パラメータの値を「推測」します。メソッドはまだジェネリックですが、メソッドが呼び出されたときにジェネリック構文はどこにも見られません (通常)。

于 2012-05-28T15:14:45.513 に答える