我正在努力重构一些遗留代码,并且拥有大量共享相同属性和字段的数据对象。
我也正在做一些关于重构的阅读,乍一看它看起来我应该使用Extract Superclass。当我所有的组合属性时,这是一个好主意吗?我的意思是他们真的只是自动创建方法的字段,所以如果我们谈论组合适合的GetXYZ功能......?
考虑到这一点,让我们假设我的所有对象共享5个共同属性:
public string Name { get; private set; }
public string Status {get; private set; }
public int IDNumber { get; private set; }
public int LocationID { get; private set; }
public Location LocationObj { get; private set; }
从子类设置这些内容的最佳方法是什么?此外,我还会将隐私套装更改为受保护的套装。
1)我应该传入values / object并在每个子类构造函数中设置基类属性吗?这有一些代码重复
2)传递参数并让派生类调用基类构造函数?
3)在基类上创建受保护的方法,如SetBaseProperties?将所有这些作为参数? (这似乎很像#2除了方法与ctor之外)
我不知道的任何其他方法?
答案 0 :(得分:9)
方法#1 不是一个好主意,因为可以通过让基类按照您的建议处理它来轻松简化。
方法#2 会减少您需要编写的重复代码量,并将所有逻辑保留在基类中。
public SubItem(string name, string status, int id, int locID, Location loc) : base(name, status, id, locID, loc)
方法#3 与您所说的基本相同,但使用构造函数而不是方法可以保证设置这些属性。 (您可能很容易忘记调用该方法)。
使用属性和方法#2是最好的选择。如果您的基类仅用于保存这些公共属性,并且未使用,请记住将其标记为abstract
,以使其无法实例化。 (仅由派生类实现)
如果您有ReSharper,则可以按Alt-Insert, C
在派生类中创建派生构造函数。 (我很确定VS默认没有此功能)