2011-11-24 76 views
2

我有一個設計問題。我正在修改現有的代碼以及我正在實例化新類的位置。由於將該類轉換爲我可以理解的Abstract類,它給了我錯誤。它拋出一個錯誤,因爲你不能創建抽象類的實例。具體的課使用的抽象類?設計問題?

我有這個代碼下面

ExampleProcessor pro = new ExampleProcessor(); 

但現在ExmapleProcessor類變成抽象類。

public abstract class ExmapleProcessor { 
    public abstract void Method1(); 
    public abstract void Method2(); 
} 

子類AExampleProcessor和BExampleProcessor。

public class AExampleProcessor : ExampleProcessor 
{ 
    public override void Method1() { //do something } 
    public override void Method2() { //do something } 
} 

public class BExampleProcessor : ExampleProcessor 
{ 
    public override void Method1() { //do something } 
    public override void Method2() { //do something } 
} 

所以這行代碼導致42個錯誤「ExampleProcessor pro = new ExampleProcessor();」隨處可見。

我不想做

AExampleProcessor pro = new AExampleProcessor(); 

BExampleProcessor pro = new BExampleProcessor(); 

,因爲我想我的應用程序來決定使用哪一個類。我怎樣才能讓它加載正確的課程?

我想代碼示例,請..

回答

7

創建一個工廠:

public static class ExampleProcessorFactory 
{ 
    public static ExampleProcessor Create() 
    { 
     if(IsFullmoon) 
      return new ExampleProcessorA(); 
     else 
      return new ExampleProcessorB(); 
    } 
} 

然後調用ExampleProcessorFactory.Create()替換所有呼叫new ExampleProcessor()。現在你已經封裝了實例化邏輯並選擇了要實例化的具體類,可以應用任何邏輯來決定實例化哪個類。 (決定什麼時候使用哪個班級可能會受益於與滿月無關的一些改進的邏輯)。

+0

正是我寫的,哈哈。 MSDN參考 - http://msdn.microsoft.com/en-us/library/ee817667.aspx –

+0

@RichardD:即本文引用圖案的更先進的變體,而我的代碼只是一個[工廠方法](HTTP ://en.wikipedia.org/wiki/Factory_method_pattern)該示例是[抽象工廠](http://en.wikipedia.org/wiki/Abstract_factory_pattern)。 –

+0

這會教我,然後再發布正確讀取:d –

2

既然你想要的應用程序來決定使用哪些具體子類,我建議你使用工廠模式。
這樣,客戶端代碼只知道您正在使用ExampleProcessor,並且實現細節仍然隱藏。