【问题标题】:Creating static behavior that can be overridden in derived classes in C#在 C# 的派生类中创建可以被覆盖的静态行为
【发布时间】: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


【解决方案1】:

您可以为此使用new 关键字。它不像覆盖那么干净,但可以完成工作:

public class Effect
{
    public static Effect CreateEffect()
    {
        if (!IsCreateable())
        {
            return null;
        }

        return new Effect();
        //Otherwise create the effect
    }

    public static bool IsCreateable()
    {
        //Some generic logic common amongst all Effects
        return true;
    }
}

public class Effect2 : Effect
{
    public new static Effect2 CreateEffect()
    {
        if (!IsCreateable())
        {
            return null;
        }

        return new Effect2();
        //Otherwise create the effect
    }

    public new static bool IsCreateable()
    {
        //Some generic logic common amongst all Effects
        return true;
    }
}

【讨论】:

  • 在这种情况下,您必须将 CreateEffect 方法复制并粘贴到每个派生的 Effect 类中,即使它们都是相同的,对吧?
  • 不,如果它在所有类中都相同,则不要创建新的静态方法并使用基类的实现。仅覆盖更改的功能。您只能在那些对IsCreateable 具有不同机制的类中覆盖它,其他人将使用基类方法。
  • 在这种情况下,Effect2.CreateEffect 将创建一个新的 Effect(),而我真的需要它来创建一个新的 Effect2(从技术上讲,我需要它来执行 AddComponent 而不是 new)。
猜你喜欢
  • 2018-12-17
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 2015-12-11
  • 2020-04-04
相关资源
最近更新 更多