【问题标题】:Omitting a subclass constructor's arguments in C#在 C# 中省略子类构造函数的参数
【发布时间】:2017-04-18 00:52:36
【问题描述】:

假设我有一个抽象超类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 更改为CarCarVehicle 的子类,因此它具有 Vehicle 的所有 API 成员,除了它们的构造函数之外,没有任何类需要更改。

有没有办法按照以下方式做一些事情:

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

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

【问题讨论】:

    标签: c# class oop inheritance


    【解决方案1】:

    不,它没有语法糖。

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

    class ConstructorParams 
    { 
      public int a {get;set;}
    } 
    
    ...
    public Base( ConstructorParams p) {...}
    ...
    public Sub(ConstructorParams p) : Base(p) {}
    

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

    【讨论】:

    • 啊,关于重构的好点。我的背景是脚本,使用像 Notepad++ 这样的编辑器,我们最接近重构的是查找和替换,所以我完全忘记了它。
    猜你喜欢
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2011-09-25
    • 2021-03-12
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多