关于以下模型,如何编写方法Make
来实现
用法目的?
注意:
我不想在每个派生类中重复Make
方法。
用法:
Derived instance = Drived.Make();
AnotherDerived instance = AnotherDrived.Make();
ThirdDerived instance = ThirdDrived.Make();
型号:
class Base
{
public static Base Make()
{
// What to write here?
}
}
class Derived : Base
{
}
class AnotherDerived : Base
{
}
class ThirdDerived : Base
{
}
答案 0 :(得分:3)
你会把它写成:
class Derived : Base
{
public static Derived Make()
{
???
}
}
Base无法使用Make
方法,它们都是静态的,因此彼此没有关系。
答案 1 :(得分:3)
尽管人们给出了很好的解决方案,但我得出的结论是,这是不可能的。我的问题的来源是误解静态方法如何在派生类上工作。我刚发现Derived.Make()
会立即编译为Base.Make()
,因此Base
永远不会知道调用Make
的类型。 Derived.Make()
只是一条捷径。
答案 2 :(得分:3)
静态方法不会被继承。在语法上,它们看起来是,但是当它被编译时,基类方法被直接调用。您必须在基类中有一些方法来指示您要创建的类型。我认为可以通过在方法上使用泛型(如另一个答案中的建议)或类本身来完成:
class Base<T> where T : new()
{
public static T Make()
{
return new T();
}
}
class Derived : Base<Derived>
{
}
class AnotherDerived : Base<AnotherDerived>
{
}
class ThirdDerived : Base<ThirdDerived>
{
}
答案 3 :(得分:1)
要只使用一种方法,您可以使用通用方法:
class Base
{
public static T Make<T>() where T : Base
{
if (typeof(T) == typeof(Derived))
{
return (T)(object)new Derived();
}
// obviously more cases in here. just for illustration.
else
{
return null;
}
}
}
然后你必须把它称为
Derived d = Base.Make<Derived>();
除非您认为代码生成是一个选项,否则没有选择在基类中编写一个方法并让Derived.Make
和AnotherDerived.Make
执行其他操作(此外返回不同类型的方法)。这些并不是引擎盖下的不同方法。它们充当Base.Make
的别名,除非您在每个派生类中定义新方法。
答案 4 :(得分:0)
您可以为每个派生类定义转换构造函数,并使用如下所示的make :(派生)Derived.Make();