State1,State2和State3都具有相同的构造函数。我怎样才能简化事情,这样我就不需要在State1,State2和State3中有构造函数?
public class State1 : State{
public State1( StateMachine owner ) : base( owner ){
}
}
public class State2 : State{
public State2( StateMachine owner ) : base( owner ){
}
}
public class State3 : State{
public State3( StateMachine owner ) : base( owner ){
}
}
到目前为止,我能找到的最佳解决方案是:
State1 s1 = new State( this ) as State1;
State1 s2 = new State( this ) as State2;
State1 s3 = new State( this ) as State3;
但它看起来很乱。
答案 0 :(得分:4)
如果你希望它们确实是State
的子类,那么没有,没有比这更简单的方法,至少没有一个是正确的并且遵循良好的设计模式。
您提出的解决方案实际上并不像您认为的那样有效。它将创建三个State
对象并尝试将它们作为指示的子类进行转换。这将失败,as
运算符将在所有三种情况下评估为null
。
答案 1 :(得分:1)
你可能并不需要这样做......如果真的需要构造函数,就没有办法避免重复构造函数。但是,如果您可以使用对象初始化器,则可能根本不需要构造器。所以你可以使用无参数的构造函数并构造你的对象:
var state1 = new State1() { Owner = this };
var state2 = new State2() { Owner = this };
var state3 = new State3() { Owner = this };
答案 2 :(得分:0)
正如其他人所说,如果要在基类中执行具有一个或多个参数的构造函数,则必须在派生类中实现等效的构造函数。
要消除任何挥之不去的疑问,请点击此处horse's mouth:
当您定义一个类派生自另一个类时,派生 class隐式获取基类的所有成员,除了 它的构造函数和析构函数。
你可以做的一件事,但是在不知道更多关于你的申请的情况下,我留给你判断这是安全的还是可取的:让Owner
成为State
的静态属性。这将使您能够使用
State.Owner = this;
State1 s1 = new State1();
State2 s2 = new State2();
State3 s3 = new State3();
在您的派生类中,您将Owner
作为State.Owner
访问。