C# 抽象类-->;获取当前派生类的新实例
是否可以获取当前派生类的新实例,该派生类正在调用基抽象类的函数?例如:C# 抽象类-->;获取当前派生类的新实例,c#,abstract-class,derived-class,C#,Abstract Class,Derived Class,是否可以获取当前派生类的新实例,该派生类正在调用基抽象类的函数?例如: class Bar1 : Foo { } class Bar2 : Foo { } abstract class Foo { public Foo CreateAnotherInstance() { return new Bar1/Bar2(); // depending on the calling derived class } } 应导致: Bar1 bar1 = n
class Bar1 : Foo
{
}
class Bar2 : Foo
{
}
abstract class Foo
{
public Foo CreateAnotherInstance()
{
return new Bar1/Bar2(); // depending on the calling derived class
}
}
应导致:
Bar1 bar1 = new Bar1();
Bar2 bar2 = new Bar2();
Foo bar1_2 = bar1.CreateAnotherInstance(); // Should be a new Bar1 instance
Foo bar2_2 = bar1.CreateAnotherInstance(); // Should be a new Bar2 instance
我发现创建实例的唯一方法是使用抽象方法,在每个派生类中创建实例,如:
class Bar1 : Foo
{
public override Foo CreateAnotherInstance()
{
return new Bar1();
}
}
class Bar2 : Foo
{
public override Foo CreateAnotherInstance()
{
return new Bar2();
}
}
abstract class Foo
{
public abstract Foo CreateAnotherInstance();
}
但是通过这种方式,我必须为每个派生类创建方法
这个问题有没有更简单的解决方案?感谢RenéVogt和mjwills给出的答案: 使用 因此,将抽象类更改为:
abstract class Foo
{
public Foo CreateAnotherInstance()
{
return (Foo)Activator.CreateInstance(GetType());
}
}
如果构造函数不是无参数的:
(Foo)Activator.CreateInstance(GetType(), para1, para2, ...);
虽然
Activator.CreateInstance
是一种很好的方法,但我不确定这是属于基本抽象类的方法,或者确实是属于这些类中的任何一个。这不是打破了吗?或者至少是Liskov替代原理
在任何情况下,作为一种替代方案,创建一个适用于任何类型的简单方法如何,而不仅仅是上述类型。e、 g
public static T CreateNew<T>(params object[] parms)
{
return (T) Activator.CreateInstance(typeof(T), parms);
}
publicstatict CreateNew(params对象[]parms)
{
return(T)Activator.CreateInstance(typeof(T),parms);
}
这还允许您传入构造函数参数(如果有)。为什么需要它
bar1
已经是bar1
返回激活器.CreateInstance(GetType())的实例如果派生类具有公共无参数构造函数,则代码>将起作用。是的,请参阅mjwills的链接或@Pedro。您应该将解决方案添加为自我回答,而不是在原始帖子中。
public static T CreateNew<T>(params object[] parms)
{
return (T) Activator.CreateInstance(typeof(T), parms);
}