[英]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.