2

我有界面:

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

使用这种方法的简单类

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

和这样的父类:

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

我想从子类中的 Set 方法返回父类型这可能吗?我需要它做这样的事情:

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

所以也许好的解决方案是从这个方法返回一个对象;\?

具有泛型接口的泛型类似乎会浪费大量内存......因为这个类的功能相同,只有返回类型不同

4

3 回答 3

5

你可以做到这一点的唯一方法是制作Base泛型 ( Base<T>) 并Set返回T- 然后拥有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));
    }
}

编辑:最好将接口实现移动到基类,正如 Marc 所说:

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

好吧,如果我使用泛型基类,我不能将父类转换为一种类型,我不知道为什么我尝试在那里使用泛型......我现在找到了解决方案:)

谢谢帮助

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 回答