我对OO设计没有实际经验,因此我对以下问题采用的解决方案犹豫不决:
我必须处理来自N个不同来源,不同格式的网络文本文件 - 处理包括经典的读取,计算和插入数据库。
我设计的解决方案是创建一个类,它定义所有与核心/文件格式无关的功能/行为,并根据文件创建来自后者的派生类,其中每个类都包含适当的格式读取逻辑。键入给定的类句柄。
所有文件都是通过File.ReadAllLines()读取的,不同的是将文件中的字段映射到主对象的变量中。所以我通过在基类中定义一个事件来做到这一点,该事件在File.ReadAllLines()之后调用,并且所有派生类将它们的映射逻辑附加到继承的事件。
但我明白这个解决方案在设计方面不正确。首先,实例化基类没有任何意义,因此它应该是抽象的。我没有把它抽象的原因是所有派生对象的构造代码是相同的,所以我将它定义为基础构造函数。我应该在抽象类中声明一个“Initialize”方法,并在每个派生类的构造函数中简单地调用它吗? (看起来很奇怪......) 也许界面?我没有看到使用界面如何在这里给我任何好处,除了它不会解决这个“构造函数”问题......
什么是正确的解决方案?
我的方案的代码演示:
public delegate void myDelegate(object parameter);
class Base
{
#region Attributes
...
#endregion
public Base(object p)
{
//initialization code
...
}
#region Methods
protected void m1() { }
protected void m2() { }
...
#endregion
public event myDelegate myEvent;
}
class Child1
{
public Child1(object o) : base(o)
{
this.myEvent += new myDelegate(ChildMethod);
}
public void ChildMethod(object o)
{
...
}
}
答案 0 :(得分:2)
首先,实例化基类没有任何意义,因此它应该是抽象的。我没有把它抽象的原因是所有派生对象的构造代码是相同的,所以我将它定义为基础构造函数。
您仍然可以使基类抽象,但在基类构造函数中具有通用的构造函数逻辑。我在你的代码中看到你已经知道如何call the base class constructor;这就是你需要做的一切。
abstract class Base {
public Base(object o) { }
public abstract void M();
}
class Derived : Base {
public Derived(object o) : base(o) { }
public override void M() { }
}