7 1/2 年后...
我非常想做同样的事情,这就是我发现这个问题的方式。有一个与所要求的内容接近的解决方案,可能对其他搜索此问题的人有用。
我想要一个静态方法,它会返回一个类的实例,其中包含为我设置的所有基本设置。以下作品:
void Main()
{
ChildClassA cA = ChildClassA.SetFoo();
}
public abstract class BaseClass
{
public bool Foo {get; set;}
}
public class ChildClassA : BaseClass
{
public static ChildClassA SetFoo() => new ChildClassA{Foo = false};
}
public class ChildClassB : BaseClass
{
public static ChildClassB SetFoo() => new ChildClassB { Foo = false };
}
这一切都很好,但我想将 SetFoo 函数放在基类中,以便
- 我不必有那么多重复的代码和
- 确保所有 BaseClass 对象都有
SetFoo。
你不能这样做:
public abstract static BaseClass SetFoo;
因为静态的东西不可能是抽象的。你也不能这样做:
public static BaseClass SetFoo => new BaseClass{ Foo = false };
因为你不能新建一个抽象类。
不过,您可以做的是使用泛型来指定您想要的派生类型。看起来像这样:
void Main()
{
ChildClassA cA = BaseClass.SetFoo<ChildClassA>();
}
public abstract class BaseClass
{
public bool Foo {get; set;}
public static T SetFoo<T>() where T:BaseClass, new() => new T{Foo = false };
}
public class ChildClassA : BaseClass
{
// You can leave this here if you still want to call ChildClassA.SetFoo();
//public static ChildClassA SetFoo() => new ChildClassA{Foo = false};
}
public class ChildClassB : BaseClass
{
//Again, you can leave this for ChildClassB.SetFoo()--the compiler won't mind
//public static ChildClassB SetFoo() => new ChildClassB { Foo = false };
}
这只是比我们真正想要的(派生的.StaticBase)稍微笨拙一点,但非常接近。