2009-01-19 34 views
1

我有幾個問題決定如何最好地描述C#(.NET 3.5)中的某個數據結構。如何最好地在C#中構造類層次結構以啓用對父類成員的訪問?

我必須創建一個類庫,爲命令行程序的輸入創建一些文本文件。有幾十種文件類型,但其中大多數都具有類似的頁眉,頁腳和其他一些屬性。

因此,一個文件可能是這樣的:

timestamp filename company 

....lots of attributes that make up the file body.... 

footerdetail1 footerdetail2 footerdetail3 

現在這些幾十個文件類型的,實際上只有三個獨特的頁眉/頁腳連擊。

所以我想創建包含大部分headerItems和footeritems的父類,然後實現在派生類中的實際文件類型:

class BaseFileType { 

public List<HeaderItems>; 
public List<BodyItems>; 
public List<FooterItems>; 
FileType filetype; 
String filename; 

public BaseFileType1 (FileType filetype,String filename) { 

    this.filetype = filetype; 
    this.filename = filename; 


    // add stuff to the header list 
    // add stuff to the footer list 


} 

    // some methods to find items in the header/ footer lists 

} 

class ActualFile1 : BaseFileType { 

    ActualFile() { 


    //add stuff to the bodyitems list 
    } 


    //some other generic methods 


} 

的事情是,我想繼承構造器從派生類的基類中,但從我讀過的這個不能完成。這裏最好的策略是什麼?

我已經看到了,我可以從我的派生類的構造函數調用基類的構造像這樣:

actualFile中():基地(父參數)

這甚至去了解我的任務的最佳方式?最後,我只是尋找所有這些文件信息的最佳數據結構,所以我在做這些類時不需要重複自己。

還有什麼別的辦法可以解決人們的問題?有一個單獨的FileFactory,它會吐出包含我需要的結構的類?

回答

0

這看起來像一個模板方法將解決...(最後一個地方使用的圖案:)

接着對每個3獨特組合的,中間級類等

abstract public class UniqueHeaderFooterCombination1 : DocumentGenerator 
{ 
    protected override void AddHeader() 
    { 
    Console.WriteLine("unique combination1 header"); 
    } 
    protected override void AddFooter() 
    { 
    Console.WriteLine("unique combination1 footer"); 
    } 
} 

最後的具體類爲每個唯一的文件類型

public class LetsSayCSVGenerator : UniqueHeaderFooterCombination1 
{ 
    protected override void AddBody() 
    { 
    Console.WriteLine("csv body items"); 
    } 
} 

將此與Factory結合可爲FileType返回正確類型的Generator,然後完成。

abstract class DocumentGeneratorFactory 
{ 
    public static DocumentGenerator GetGenerator(FileType eFileType) 
    { 
    switch (eFileType) 
    { 
     // a hash of FileType => Generator 
     default: 
     return new LetsSayCSVGenerator(); 
    } 

    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
    DocumentGenerator d = DocumentGeneratorFactory.GetGenerator(FileType.CSV); 
    FileInfo f = d.Generate("ItsAlive.CSV"); 
    } 
} 
0

正如你所說,構造函數不是繼承的。

如果您需要知道構造過程中的值,強制派生類在構造函數中提供細節將是理想的情況。如果不考慮一個抽象的屬性,派生類必須提供:

// base-class 
public abstract FileType FileType {get;} 

// derived-class 
public override FileType FileType { 
    get {return FileType.Excel;} // or whatever 
} 

需要注意的是,除非你將其記錄下來非常清楚(和理解的含義),你不應該調用虛方法(如如上所述)在構造函數內部(因爲派生類型的構造函數尚未執行) - 但在此之後就沒有問題了。

由於文件名不是真的依賴於子類型,我懷疑我會以任何方式將它作爲ctor參數。

0

您可以讓您的基類讀取頁眉&頁腳,並提供對中間屬性的訪問。然後定義幾十個特定屬性讀取器將實現的接口。接口可能需要接受一個「基類」,每個實現將定義如何讀取中間的東西。

實際上,您可以通過一種常用方法來閱讀常見部分以及訪問屬性的常用方法。這部分是鬆散耦合的,所以更改限制較少。