Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中重构这些类扩展#_C#_Oop_Inheritance - Fatal编程技术网

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

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 ){

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;

但是看起来很乱

如果您希望它们确实是
状态的子类,那么没有比这更简单的方法了,至少没有一种方法是正确的,并且遵循良好的设计模式


而你提出的解决方案实际上并不像你想象的那样有效。它将创建三个
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
是一个单例,那就不好了。)请注意,如果状态被设计为不可变的,那么这就不能合理地工作。(在没有看到其他各种状态类的情况下,很难确定。)