C# 如何在C中重构这些类扩展#
State1、State2和State3都具有相同的构造函数。如何简化事情,使State1、State2和State3中不需要构造函数C# 如何在C中重构这些类扩展#,c#,oop,inheritance,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 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;
但是看起来很乱 如果您希望它们确实是
状态的子类,那么没有比这更简单的方法了,至少没有一种方法是正确的,并且遵循良好的设计模式
而你提出的解决方案实际上并不像你想象的那样有效。它将创建三个State
对象,并尝试将它们转换为指定的子类。这将失败,as
运算符在所有三种情况下的计算结果都将为null
。您可能不太需要这样做。。。如果他们真的需要成为构造函数,那么就没有办法避免重复构造函数。但是,如果可以使用对象初始值设定项,那么可能根本不需要构造函数。因此,您可以使用无参数构造函数,像这样构造对象:
var state1 = new State1() { Owner = this };
var state2 = new State2() { Owner = this };
var state3 = new State3() { Owner = this };
正如其他人所说,如果要在基类中执行具有一个或多个参数的构造函数,则必须在派生类中实现等效的构造函数
为了消除任何悬而未决的疑问,以下是:
定义从另一个类派生的类时,派生
类隐式获取基类的所有成员,除了
它的构造函数和析构函数
有一件事您可以做,但在不了解任何有关应用程序的更多信息的情况下,我让您来判断这是安全的还是可取的:将Owner
设置为State
的静态属性。这将使您能够使用以下代码
State.Owner = this;
State1 s1 = new State1();
State2 s2 = new State2();
State3 s3 = new State3();
在派生类中,您将访问Owner
作为状态。Owner
该“解决方案”将所有三个变量保留为null
。simplify
是否意味着写更少的代码或看到更少的代码?我没有投票,因为在我看来OP可能希望能够做到State1 s1=newstate1(这)
,除非没有在从状态派生的每个类上显式声明新构造函数
@SamIam,该类只有在父类有自己的无参数构造函数时才起作用,并且假设不需要传递任何初始值。(例如,如果StateMachine
是一个单例,那就不好了。)请注意,如果状态被设计为不可变的,那么这就不能合理地工作。(在没有看到其他各种状态类的情况下,很难确定。)