簡體   English   中英

面向對象的設計問題 - 抽象,派生/實現類型 - 用例場景

[英]Object oriented design issues - abstract, derived/implementing types - a use case scenario

我對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() { } 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM