2009-06-20 6 views
2

私持っているインタフェース:C#の子クラス未知のタイプを返す(futher:親から)

public class Parent : Base, Inx<Parent> 
{ 
    ... 
} 
:そのようなこのmetod

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

と親クラスと

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

単純なクラス

子クラスのSet metodから親タイプを返すようにします 可能でしょうか?

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機能が同じであるだけで戻り値の型は

答えて

0

はこれが何をしたいです:あなたは便利さておき、ここで

はあなたがBase<T>にインタフェースの実装を移動させることができるということです... where T : new()句を持っているだろうか?

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)); 
    } 
} 

EDIT:マルクが言ったようにこれは、基底クラスへのインタフェースの実装を上に移動すると良いでしょう:私は1種類に親クラスをキャストすることはできません一般的な基本クラスを使用するだけでなく場合

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));    
    } 
} 
5

切り抜いているあなたがそれを行うことができる唯一の方法は、Baseがジェネリックにするだろう(Base<T>Setを返すT - 次にParent : Base<Parent>を持っています。問題は... Setはどのように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> { } 
0

、私はジェネリックが使用しようとした理由 は、私は今:)助けを

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)); 
    // ... 
} 
関連する問題