如何引用抽象类

时间:2019-05-25 21:37:30

标签: c# abstract-class

我想引用一个工作者中多个可能的抽象类之一,并使用当前类的execute()函数。 我不明白如何保存此类的引用,或者是否需要某种指针/引用/泛型...

基类是抽象的,我认为派生类也应该是抽象的(因为我不想实例化它们中的任何一个,并且据我所知,我无法创建一个从基类派生的静态类)

贝洛是一个简化的示例,试图弄清楚我想要实现的目标。 根据评论中的反馈,我尝试使用Actions来保存类引用,但这会在编译时产生错误

worker.set_class(WaitClass);

WaitClass the type is not valid in the indicated context
using System;

public abstract class BaseClass
{
    // Include some fields
    public int value;

    protected BaseClass(int init_value)
    {
        value = init_value;
    }

    // Define some method that should be declared by the concrete action
    public abstract void execute();
}

public abstract class WaitClass : BaseClass
{
    private WaitClass() : base(42) { }

    public override void execute()
    {
        // Dome something useful here
    }
}

public class Worker
{
    // Hold somehow a reference to one of the possible actions
    Action current_class;

    public void set_class(Action new_class)
    {
        current_class = new_class;
    }

    public void do_something()
    {
        int x;
        Random random = new Random();
        // Do something with value
        x = random.Next(1000) * current_class.value;

        current_class.execute();
    }
}

public class TestClass
{
    public static void Main()
    {
        Worker worker = new Worker();
        worker.set_class(WaitClass);
        worker.do_something();
    }
}

1 个答案:

答案 0 :(得分:0)

免责声明:我不会讲C#,但是我怀疑情况与C ++类似。其余的答案基于我的C ++和一般的OOP经验。

如果我对您的理解正确,那么您希望通过基类引用保存派生类对象,并在这些对象上调用多态(“虚拟”)方法。因为您希望这些派生类是“无状态的”(即没有数据成员),所以您认为也许可以“摆脱”静态(和/或抽象)类。

问题是您需要实例化一些内容以放入Holder对象中。换句话说,您将需要通过Holder中的引用来引用的具体对象,正如一些注释者已经指出的那样。这就是为什么抽象类不会这样做的原因-它们无法实例化。

只需继续从抽象基类派生具体的(非抽象的)类,就不必担心它们的无状态性。定义和使用没有数据成员的具体对象是完全可以的。实例化它们,然后使用对(抽象)基类的引用来初始化Holder对象,仅此而已。通过基类引用进行的多态方法调用将完成其余工作。