2010-02-12 50 views
1

我想創建一個抽象類,定義一個抽象方法,它是從其他類中抽象出來的,這些類在抽象方法中實現了一些特定的行爲。我希望抽象類包含某種狀態信息,它代表派生類中的實現沒有錯誤,但我想在AbstractClass中實現所有狀態處理,而不是在派生類中實現。我想讓派生類完全不瞭解AbstractClass中的功能。下面是一個例子。我在代碼中提出了評論來描述我想要達到的目標。如何在基類中表示方法執行的狀態而不影響派生類中的實現?

public abstract class AbstractClass 
    { 
     public void Start() 
     { 
      ThreadStart ts = new ThreadStart(PerformWork); 
      Thread t = new Thread(ts); 
      t.Start(); 
      Thread.Sleep(2000); 

      // Dependent on if ReportWork exited without expcetions 
      // I want to call ReportSuccess or ReportFailure from this method. 
      // However, I dont want to implement any reporting functionallity (or 
      // as little as possible) 
      // into the deriving classes PerformWork() method. Simply put 
      // I want the deriving classes to be totally unaware of the reporting. 

     } 

     public void ReportSuccess() 
     { 
      Console.WriteLine("Success!"); 
     } 

     public void ReportFailure() 
     { 
      Console.WriteLine("Failure!"); 
     } 
     public abstract void PerformWork(); 
    } 

一個類繼承自抽象類:

class ConcreteImplementationClass:AbstractClass 
    { 
     public override void PerformWork() 
     { 
      // Implements some functionality 
      // without knowing anything about 
      // whats going on in AbstractClass.   
     } 
    } 

不要任何人有我如何能實現這一功能,否則我怎麼可以創建類似的東西有什麼建議?

+0

換句話說,您希望在派生類上記錄方法調用。夠簡單。 AOP。看到我的答案。 – 2010-02-12 15:34:20

+1

你能解釋爲什麼你需要這個線程? – 2010-02-12 21:13:02

回答

1

如果我正確地理解了這個,如果PerformWork()成功,並且ReportFailure()如果失敗,您希望調用ReportSuccess()

public abstract void PerformWork(); 

public void Start() 
{ 
    bool result = false; 

    // This will enable Perform work to operate in its own thread 
    Action threadAction = new Action(() => 
     { 
      result = PerformWork(); 
     }); 

    ThreadStart ts = new ThreadStart(threadAction); 
    Thread t = new Thread(ts); 
    t.Start(); 
    Thread.Sleep(2000); 

    // Dependent on if ReportWork exited without expcetions 
    // I want to call ReportSuccess or ReportFailure from this method. 
    // However, I dont want to implement any reporting functionallity (or 
    // as little as possible) 
    // into the deriving classes PerformWork() method. Simply put 
    // I want the deriving classes to be totally unaware of the reporting. 

    if(result) 
    { 
     ReportSuccess(); 
    } 
    else 
    { 
     ReportFailure(); 
    } 
} 
+0

因爲然後PerformWork不會在它自己的單獨線程上運行。 – 2010-02-12 15:41:11

+0

@Clean - 我修改了片段,使用一個Action讓Perform在它自己的線程中工作。您也可以在該線程中移動ReportSucess和Failure。我沒有,因爲我不知道你想達到什麼目的。 – 2010-02-12 16:36:33

+0

謝謝你的幫助!我認爲這與我所期望的行爲儘可能接近(沒有進入AOP)。 – 2010-02-15 08:47:34

0

如果您想在其中運行代碼,然後在所有派生方法中調用base.PerformWork(),您能不能讓您的基本方法是虛擬的?

+0

,因爲那意味着派生類必須知道抽象基的實現細節。不是一件壞事,而是OP明確表示不希望的事情。 – 2010-02-12 15:32:18

+0

是的,我可以,但我希望有一些非常乾淨的做法,不需要從派生類中調用基類。 – 2010-02-12 15:33:15

0

你所描述面向方面的編程,AOP爲什麼不能改變。

您可以使用任意數量的攔截策略輕鬆實現此目的。最簡單的可能是城堡代理。

請參閱this...

相關問題