Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 面向对象设计问题-抽象、派生/实现类型-用例场景_C#_Oop_Abstract - Fatal编程技术网

C# 面向对象设计问题-抽象、派生/实现类型-用例场景

C# 面向对象设计问题-抽象、派生/实现类型-用例场景,c#,oop,abstract,C#,Oop,Abstract,我没有OO设计的实际经验,因此我对以下问题采用的解决方案犹豫不决: 我必须处理来自N个不同来源、不同格式的网络文本文件,处理过程包括经典的读取、计算和插入数据库 我设计的解决方案是创建一个类,该类定义了与核心/文件格式无关的所有功能/行为,并根据给定类处理的文件类型,从后者创建派生类,其中每个派生类都包含适当的格式读取逻辑 所有文件都是通过File.ReadAllLines()读取的,不同之处在于将文件中的字段映射到主对象的变量中。为此,我在基类中定义了一个事件,该事件在File.ReadAll

我没有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)
    {
      ...
    }
}
首先,实例化基类没有意义,所以它应该是抽象的。我没有将其抽象化的原因是,所有派生对象的构造代码都是相同的,因此我将其定义为基本构造函数

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

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

class Derived : Base { 
   public Derived(object o) : base(o) { }
   public override void M() { } 
}

明白了。。。我甚至没有尝试它,因为我确信抽象类没有构造函数,因为它不会生成实例。。。但我现在只写了一个简单的测试,我错了。所以,是的,我可以让派生类型共享构造逻辑编码在基构造函数中,我需要的是在每个子构造函数中调用基构造函数。谢谢