繁体   English   中英

在C#中省略子类构造函数的参数

[英]Omitting a subclass constructor's arguments in C#

假设我有一个抽象超类A ,其定义为:

public abstract class A {
    protected string a1;
    protected int a2;
    protected char a3;

    public A(string a1, int a2, char a3) {
        this.a1 = a1;
        this.a2 = a2;
        this.a3 = a3;
    }
}

然后,我有了x个从A继承的类-每个类都使用相同的构造函数-但每个类都有自己的方法,这些方法以各自独特的方式使用a1,a2和a3。 尽管构造函数相同,但据我了解,我必须重新定义每个子类中参数的数量和类型,如下所示:

public sub(string a1, int a2, char a3) : base(a1, a2, a3) {}

如果我需要更改参数类型,可能会很痛苦,因为我需要调整所有11个类。 如果我使用良好的继承做法,那么在大多数情况下,如果我修改A的构造函数的参数,所有类都将受到影响,但是在某些情况下,这是不正确的。 例如,如果我将参数从Vehicle类型更改为Car CarVehicle的子类,因此它具有Vehicle的所有API成员,除其构造函数外,无需更改任何类。

有什么办法可以做以下事情:

public sub {
    public sub(...) : base(...) {}
}

这样,当参数类型更改时,就不需要更改所有10个子类构造函数定义了吗?

不,没有语法糖。

您可以将所有参数包装在一个类中,因此对参数的更改不会影响所有类型,但是您很容易错过对新添加的参数的处理:

class ConstructorParams 
{ 
  public int a {get;set;}
} 

...
public Base( ConstructorParams p) {...}
...
public Sub(ConstructorParams p) : Base(p) {}

请注意,在VS中使用重构工具(和外部的R#一样)使对方法/构造函数的参数的更改基本上是自动进行的-因此在将所有参数打包到单个类中之前先尝试一下这些方法可能是个好主意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM