0

我没有 OO 设计的实践经验,因此我对我为以下问题采用的解决方案犹豫不决:

我必须处理来自 N 个不同来源、不同格式的网络文本文件——处理包括经典读取、计算和插入数据库。

我设计的解决方案是创建一个类,该类定义与核心/文件格式无关的所有功能/行为,并根据给定的文件类型从后者创建派生类,其中每个类都包含适当的格式读取逻辑类句柄。

所有文件都通过 File.ReadAllLines() 读取,不同之处在于将文件中的字段映射到主对象的变量中。所以我通过在基类中定义一个事件来做到这一点,该事件在 File.ReadAllLines() 之后调用,并且所有派生类都将它们的映射逻辑附加到继承的事件。

但我知道这个解决方案在设计上是不正确的。首先,实例化基类没有任何意义,所以应该是抽象的。之所以不抽象,是因为所有派生对象的构造代码都是一样的,所以我把它定义为基础构造函数。我应该在抽象类中声明一个“初始化”方法并在每个派生类的构造函数中简单地调用它吗?(看起来很奇怪......)也许是接口?我看不出使用接口会给我带来什么好处,除了它不会解决这个“构造函数”问题......

什么是正确的解决方案?

我的场景的代码演示:

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)
    {
      ...
    }
}
4

1 回答 1

2

首先,实例化基类没有任何意义,所以应该是抽象的。之所以不抽象,是因为所有派生对象的构造代码都是一样的,所以我把它定义为基础构造函数。

您仍然可以使基类抽象,但在基类构造函数中具有公共构造函数逻辑。我在您的代码中看到您已经知道如何调用基类构造函数;这就是你需要做的。

abstract class Base {
    public Base(object o) { }
    public abstract void M();
}

class Derived : Base { 
   public Derived(object o) : base(o) { }
   public override void M() { } 
}
于 2013-07-01T15:01:03.453 回答