如何在C#中重构这些类扩展

时间:2014-07-28 21:24:37

标签: c# oop inheritance

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;

但它看起来很乱。

3 个答案:

答案 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访问。