【发布时间】:2017-06-30 06:32:50
【问题描述】:
具体情况如下:我有一个基本抽象类 Effect,它包含一些在所有类型的效果之间共享的行为。然后我有几个继承自 Effect 的派生类。
我想要类似的东西
public static virtual Effect CreateEffect(GameObject obj)
{
if (!IsCreateable()) {
return;
}
//Otherwise create the effect
}
public static virtual bool IsCreateable()
{
//Some generic logic common amongst all Effects
}
然后在派生类中,其中一些需要一些额外的自定义逻辑
public static override bool IsCreateable()
{
if (custom logic) {
return false;
}
return base.IsCreateable()
}
显然这是不可能的,因为 c# 不支持静态虚函数。我想要一种在类之间共享此静态代码而无需重写代码的方法。我不能将它作为实例方法,因为在这种情况下,代码首先用于决定是否创建实例。
一般来说,您如何拥有可以在 C# 中覆盖或修改的默认行为的类型级别(不需要实例)函数?
假设此行为与构造函数不同(例如在 Unity3D 中,您不能使用构造函数来实例化 Monobehaviors)。
【问题讨论】:
-
与大多数编程问题一样:只需添加一个间接级别。在工厂对象而不是您要创建的实际对象上实现
IsCreatable方法 -
在工厂对象上实现 IsCreatable 是什么意思?你能详细说明一下吗?
-
您的问题与 Stack Overflow 上已经存在的所有其他“我想覆盖静态成员”问题有何不同。我在这里没有看到任何新内容......已经有很多问题的答案可以解决这种情况。如果您想要实际可覆盖的类级(静态)成员,则需要一种不同的语言。如果你想在 C# 中做这种事情,你会遇到其他问题中已经有详细记录的解决方法之一。
-
用
IsCreatable和CreateEffect方法定义一个BaseEffectFactory。根据需要编写子类,从它继承(例如,CustomEffectFactory将创建CustomEffect实例)。基本上,将“创建效果”逻辑与实际效果分开
标签: c# oop inheritance design-patterns