2013-04-17 34 views
2

我有一个通用的'设备'类型的抽象基类,并希望要求派生的特定设备类根据其各自的区别初始化列表。摘要字段是不允许的。我如何强制派生类来实例化/初始化一个字段?

当将派生类设置为活动状态时,它必须通过列表将参数设置为活动状态。每个派生类将自己的参数插入到列表中。

下面是相关代码:

基类:

 abstract public class Device : Common, IDisposable 
     { 
      abstract public Boolean bActive 
      { 
      get; 
      set; 
      } 

      abstract List<Parameters> ActiveParameters; 
      ... 
     } 

我不想初始化列表中的基类,因为我不知道哪些参数会被插入到你派生类的列表。此代码产生一个错误,说我不能有一个抽象字段,我明白,但有没有办法要求派生类从基类初始化一个字段?

+3

这个问题的前提是基类是派生类的“主人”:即它可以对他们施加限制,并迫使他们以某种方式行事。你发现很难做到这一点,因为这实际上并不是基类和派生类之间的关系。基类是派生类的仆人;它提供了一个服务,并且派生类在他们认为合适的时候使用该服务。 –

回答

2

如果这是有关初始化列表中,那么你就可以强制,通过加入该列表到构造函数(或所有构造函数,如果你有更多的人)的基类。

喜欢的东西:

public abstract class Device : Common, IDisposable 
{ 
    protected Device(List<Parameters> activeParameters) 
    { 
     ActiveParameters = activeParameters; 
    } 

    protected List<Parameters> ActiveParameters { get; private set; } 
} 

派生类将被再用力做这样的事情:

public class ConcreteDevice : Device 
{ 
    public ConcreteDevice() 
     : base(new List<Parameters>()) 
    {} 
} 
+0

有趣。这将要求执行该课程的任何人都了解该要求。我会给这个镜头。谢谢。 – CramerTV

+1

@CramerTV你是什么意思?如果他们没有意识到需求,他们不会在构造函数中调用'base()',但该代码不会编译。 – svick

+0

这就是我的意思。如果他们的代码不能编译,他们必须找出原因并意识到他们需要初始化该类,因此希望能够引导他们理解他们需要在该领域做些什么。 (当我说'他们'时,我的意思是*我*。这只是一种迫使我记住做一些事情的方法,然后它会导致一个我必须稍后想到的错误。) – CramerTV

1

此代码产生一个错误,说我不能有一个抽象字段,我明白,但有没有办法要求派生类从基类初始化字段?

如果这需要实施,它应该是您的API的一部分。为了解决这个问题,你可以使这个保护属性。这将迫使它由所有派生类实现。

protected abstract List<Parameters> ActiveParameters { get; } 
+0

我并不是真的希望'获得'列表,而是添加和删除成员,并能够遍历它。我想我可以'得到'列表,然后添加/删除/迭代,但我有点希望有点不同。也许这就是全部。感谢您的建议。 – CramerTV

+0

@CramerTV要添加或删除列表中的项目或迭代它,首先需要以某种方式“获取”它。 – svick