c# - 初始化基类中的所有派生成员变量是不是一个坏主意?
问题描述
我有一堆从基类继承的派生类。每个派生类仍然有唯一的成员。这些派生类之一需要能够访问所有其他派生类的成员。我对这个问题的目标是编写尽可能少的代码。
在基类中初始化所有派生类的成员以便派生类之一可以访问这些成员,而不是在所述派生类中初始化它们是草率还是不好的做法?
建议的方法:
public class BaseClass {
public BaseClass() {
...
der1Initializer = Der1Initializer(new Factory1());
der2Initializer = Der1Initializer(new Factory2());
List initializers = new List(){ der1Initializer , der2Initializer };
der3Initializer = Der3Initializer(initializers);
}
Der1Initializer der1Initializer;
Der2Initializer der2Initializer;
Der3Initializer der3Initializer;
}
public class DerivedClass1 : BaseClass {
public SomeFunction {
der1Initializer.init();
}
}
public class DerivedClass2 : BaseClass {
public SomeFunction {
der2Initializer.init();
}
}
public class DerivedClass3 : BaseClass {
...
}
以便:
public class Der3Initializer {
public GroupInitializationFunction {
initializers[0].init(); //der1Initializer
initializers[1].init(); //der2Initializer
}
}
代替:
public class BaseClass {
public BaseClass() {
...
}
public class DerivedClass1 : BaseClass {
public DerivedClass1 {
der1Initializer = Der1Initializer(new Factory1());
}
public SomeFunction {
der1Initializer.init();
}
Der1Initializer der1Initializer;
}
public class DerivedClass2 : BaseClass {
public DerivedClass2 {
der2Initializer = Der2Initializer(new Factory2());
}
public SomeFunction {
der2Initializer.init();
}
Der2Initializer der2Initializer;
}
public class DerivedClass3 : BaseClass {
public DerivedClass3 {
List initializers = new List()
{
Der1Initializer(new Factory1()),
Der2Initializer(new Factory2());
};
der3Initializer = Der3Initializer(initializers);
}
...
Der3Initializer der3Initializer;
}
...
public class Der3Initializer {
public GroupInitializationFunction {
initializers[0].init(); //der1Initializer
initializers[1].init(); //der2Initializer
}
}
这是对“问题”的过度简化。此代码的目的是减少重复代码和重新初始化可共享成员的需要并优化性能。
我知道让其他类访问他们不使用的成员不一定是一个好主意。
我只是认为这是一个关于代码分离与重复代码的有趣问题。
解决方案
我不建议将父类上的子类初始化为
违反了开放封闭原则,因为基类有责任初始化其子类,并且总是需要添加新的子类并因此修改基类。
违反单一职责原则 ,因为这不是基类的角色(初始化其子类)
违反控制反转,因为基类与子类紧密耦合,请参阅此链接
推荐阅读
- ios - 为什么我的初始 ViewController 只显示在模拟器 Hello World 上?
- timer - 如何用 ATL CAxDialogImpl 方法替换 MFC CDailog::OnTimer?
- python - 如何替换DataFrame(Python)中字符串列表中的字符串?
- javascript - JQuery 仅重新加载 div 数据
- javascript - 为什么此代码在之前工作时不起作用并为随机值添加按钮
- python - 为什么我在 SQL 语法中出现错误,无法将记录插入 MySQL 表 1064 (42000)?
- python - h5py:如何组织 HDF5 文件以有效读取混合数据类型对象
- parsing - 在 EOS(字符串结束)处停止 Raku 语法
- c# - 从 API 请求数据并在 C# 中将 DataSet 显示到 Excel 时如何检查 NewtonJson Jarray 空/空错误
- java - 为什么我的 2 个 JButton 在设置为 1 时占用 2 个空格(网格宽度)?