我有界面:
public interface Inx<T>
{
T Set(Data data);
}
使用此metod的简单类
public class Base
{
??? Set(Data data) { ... }
}
和那样的父类:
public class Parent : Base, Inx<Parent>
{
...
}
我想从子类中的Set metod返回父类型 这是可能的 ? 我需要这样做:
list.Add(new Parent().Set(data));
现在我必须这样做:
T t = new T();
t.Set(data);
list.Add(t);
它有点烦人,我必须多次使用它
很抱歉spam很好,我可以使用类似的东西:
this.GetType().GetConstructor(new System.Type[] { typeof(Data) }).Invoke(new object[] { data })
所以也许好的解决方案是从这个方法返回一个对象; \?
通用界面的通用类似乎是大内存浪费...这个类的beacose函数是相同的只返回类型是不同的答案 0 :(得分: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> { }
答案 1 :(得分: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类,如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));
}
}
答案 2 :(得分: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));
// ...
}