2

私はインターフェースを持っています:

public interface Inx<T>
{
   T Set(Data data);
}

このメソッドを使用した単純なクラス

public class Base
{
   ??? Set(Data data) { ... }
}

そしてそのような親クラス:

public class Parent : Base, Inx<Parent>
{
   ...
}

子クラスの Set method から Parent 型を返したいのですが可能ですか?そのようなことをする必要があります:

list.Add(new Parent().Set(data));

今、私はそれをしなければなりません:

T t = new T();
t.Set(data);
list.Add(t);

そして、それは少し面倒です、私はそれを何度も使わなければなりません


うーん、私はそのようなものを使うことができます:

this.GetType().GetConstructor(new System.Type[] { typeof(Data) }).Invoke(new object[] { data })

したがって、このメソッドからオブジェクトを返すのが良い解決策かもしれません;\ ?

ジェネリック インターフェイスを備えたジェネリック クラスは、大きなメモリの浪費のようです ... このクラスの beacose 関数は同じであり、戻り値の型が異なるだけです

4

3 に答える 3

5

これを行う唯一の方法は、Baseジェネリック ( Base<T>)を作成し、 Setreturn T- then have を使用することParent : Base<Parent>です。問題は... のSet作成方法をどのように知るのでしょうTか? あなたはwhere T : new()条項を持つことができます...

ここで役立つのは、インターフェイスの実装をBase<T>次の場所に移動できることです。

public class Base<T> : Inx<T> where T : new()
{
   public T Set(Data data) {
       T t = new T();
       ///
       return t;
   }
}
public class Parent : Base<Parent> { }
于 2009-06-20T21:43:49.300 に答える
0

これは、あなたの望むことですか?

interface Inx<T> { 
    T Set(Data data);
}
public class Base
{
    public virtual T Set<T>(Data data)
    {
        T t = default(T);
        return t;
    }
}
public class Parent : Base, Inx<Parent>
{
    public Parent Set(Data data)
    {
        return base.Set<Parent>(data);
    }
}
class Program
{
    static void Main(string[] args)
    {
        var data = new Data();
        var list = new List<Parent>();
        list.Add(new Parent().Set<Parent>(data));
        // or 
        list.Add(new Parent().Set(data));
    }
}

編集: マークが言ったように、インターフェイスの実装を Base クラスに移動することをお勧めします。

interface Inx<T> { 
    T Set(Data data);
}
public class Base<T> : Inx<T>
{
    public virtual T Set(Data data)
    {
        T t = default(T);
        return t;
    }
}
public class Parent : Base<Parent>
{        
}
class Program
{
    static void Main(string[] args)
    {
        var data = new Data();
        var list = new List<Parent>();
        list.Add(new Parent().Set(data));            
    }
}
于 2009-06-21T04:44:22.183 に答える
0

ジェネリック基本クラスを使用すると、親クラスを1つの型にキャストできません。なぜジェネリックを使用しようとしたのかわかりません...解決策が見つかりました:)

助けてthx

interface Inx
{
   object Set(Data data);
}
class Base
{
   object Set(Data data)
   {
      // ...
      return (object) this;
   }
}
class Parent: Base, Inx
{
   // i don't have too write here Set (im using from base one)
}
class ManageParent<T> where T: Inx, new()
{
   // ...
      list.Add((T) new T().Set(data));
   // ...
}
于 2009-06-21T12:55:25.773 に答える