我想将AbstractObject
类型的对象与我当前的类相关联。
但是,这必须在构造函数中完成,因为当我定义我的类时,我不知道哪个类型的对象将被关联(只有它是类型AbstractObject
)。我需要在我的类中构造关联对象(所以我不能将实例作为参数)。
所以它会是这样的:
public abstract class MyClass
{
public MyClass(Type T) where T : AbstractObject
{
(T)Actiocator.CreateInstance(Typeof(T));
//To do
}
}
但这不起作用。知道如何解决这个问题吗?
答案 0 :(得分:3)
根据您的使用情况,有几种选择。
最简单的方法是让调用者构造对象,并通过构造函数传递它:
public MyClass(AbstractObject template)
{
// Do something with template
}
扩展上面的想法,如果你想控制构造函数使用的对象,你可以提供一个静态方法来创建一个Base
对象并将其传递给构造函数:
private MyClass(AbstractObject template)
{
// Do something with template
}
public MyClass Create<T>() where T : AbstractObject, new()
{
// Create a temporary object just for passing into the private ctor
return new MyClass(new T());
}
我将构造函数设为私有,因此您只能通过静态实例创建新的MyClass
对象:
MyClass.Create<Concrete>();
另请注意,我添加了new()
约束,因此我只需编写new T
即可。如果您知道T
将成为AbstractObject
的派生类(参考类型),那么这很好。如果您希望能够从MyClass
等值类型构建int
es,则可以删除new()
约束并使用反射。
如果您还需要将对象存储在类中,请将整个类设为通用:
public class MyClass<T> where T : AbstractObject, new()
{
private T myObject;
public MyClass()
{
this.myObject = new T();
// Do other stuff
}
}
答案 1 :(得分:0)
创建一个接口或抽象类,它们在要传递给当前类构造函数的类中实现它
public interface ITest
{
// your interface method and properties
}
public class Child : ITest
{
// do your stuff here
}
public abstract class MyClass
{
public MyClass(ITest tes)
{
// do stuff using test
}
}
答案 2 :(得分:0)
也许这样的事情适合你?
abstract class AbstractObject {}
class Test : AbstractObject
{
public Test()
{
Console.WriteLine("I work");
}
}
class GenTest<T> where T: AbstractObject, new()
{
T obj;
public GenTest()
{
obj = new T();
}
}
public static void Main()
{
var genTestObj = new GenTest<Test>();
}
答案 3 :(得分:-1)
试试这个:
public abstract class MyClass<T> where T : AbstractObject, new()
{
public MyClass(T type)
{
T instance = new T();
}
}
如果在泛型约束中添加new()
,则可以调用类的无参数构造函数。