我想引用一个工作者中多个可能的抽象类之一,并使用当前类的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();
}
}
答案 0 :(得分:0)
免责声明:我不会讲C#,但是我怀疑情况与C ++类似。其余的答案基于我的C ++和一般的OOP经验。
如果我对您的理解正确,那么您希望通过基类引用保存派生类对象,并在这些对象上调用多态(“虚拟”)方法。因为您希望这些派生类是“无状态的”(即没有数据成员),所以您认为也许可以“摆脱”静态(和/或抽象)类。
问题是您需要实例化一些内容以放入Holder
对象中。换句话说,您将需要通过Holder
中的引用来引用的具体对象,正如一些注释者已经指出的那样。这就是为什么抽象类不会这样做的原因-它们无法实例化。
只需继续从抽象基类派生具体的(非抽象的)类,就不必担心它们的无状态性。定义和使用没有数据成员的具体对象是完全可以的。实例化它们,然后使用对(抽象)基类的引用来初始化Holder
对象,仅此而已。通过基类引用进行的多态方法调用将完成其余工作。