【发布时间】:2019-05-06 01:10:08
【问题描述】:
我有一些嵌套类BaseOuter 和BaseInner,以及子类DerivedOuter 和DerivedInner。 BaseOuter 具有属性BaseInner baseInner;,当我实例化DerivedOuter 时,我希望baseInner 属性的运行时类型为DerivedInner。
我首先像下面这样解决了这个问题,使用虚拟初始化程序来实例化baseInner,它在DerivedOuter 中被覆盖。这使我可以在各自的初始化程序中执行 baseInner = new BaseInner(); 和 baseInner = new DerivedInner();。
在注意到Resharper warning 并执行little more reading 之后,我决定应该更改它...但是如何更改?
我想到了几件事。我可以在调用构造函数后调用初始化器,需要调用代码来做var baseOuter = new BaseOuter(); baseOuter.Initialize();。我可能可以使用工厂,但我必须考虑一下。最后,也许我想做的类嵌套存在设计缺陷?
值得指出的是,做new BaseInner(); 的成本很高,我不想简单地创建它并扔掉它。
using System;
public class Program
{
public static void Main()
{
Console.WriteLine("new BaseOuter");
var baseOuter = new BaseOuter();
Console.WriteLine("\nnew DerivedOuter");
var derivedOuter = new DerivedOuter();
}
class BaseOuter{
protected BaseInner baseInner;
public BaseOuter(){
Console.WriteLine("BaseOuter Constructor");
/* lots of stuff I want in derived class */
// This is an anti-pattern I want to avoid
//https://www.jetbrains.com/help/resharper/2018.2/VirtualMemberCallInConstructor.html
InitializeInner();
}
protected virtual void InitializeInner(){
Console.WriteLine(" BaseOuter Initialize BaseInner");
baseInner = new BaseInner();
}
protected class BaseInner{
public int x;
public BaseInner(){
/* stuff that is needed in DerivedInner too */
Console.WriteLine(" BaseInner Constructor");
x = 2;
}
}
}
class DerivedOuter : BaseOuter {
public DerivedOuter() {
Console.WriteLine("DerivedOuter Constructor (finished)");
}
protected override void InitializeInner(){
Console.WriteLine(" DerivedOuter Initialize DerivedInner");
baseInner = new DerivedInner();
}
protected class DerivedInner : BaseInner {
public double y;
public DerivedInner(){
Console.WriteLine(" DerivedInner Constructor");
y = 2d;
}
}
}
}
输出
new BaseOuter
BaseOuter Constructor
BaseOuter Initialize BaseInner
BaseInner Constructor
new DerivedOuter
BaseOuter Constructor
DerivedOuter Initialize DerivedInner
BaseInner Constructor
DerivedInner Constructor
DerivedOuter Constructor (finished)
所有代码都可以在这个.NET Fiddle中找到。
【问题讨论】:
标签: c# oop inheritance design-patterns