2013-01-02 64 views
0
class A : N 
{ 
    void sinefunc() 
    { 
      //some stuff here 
    } 
} 

class B : N 
{ 

    void sinefunc() 
    { 
     //some stuff here 
    } 
} 

class C : N 
{ 
    void sinefunc() 
    { 
     //some stuff here 
    } 
} 

sinefunc()是一種常見功能。但是,類A,B和C存在於不同的 項目下的解決方案。這些類已經繼承了一個普通類N,現在,避免代碼重複而不使用多重繼承

  1. 爲了避免代碼重複,可以將sinefunc()移到這些類之外。
  2. 但是,由於多重繼承是不允許的。什麼是有效的方法或可行的方法來使該功能通用? (請注意,我不希望把sinefunc() 類N.它已經被寫,我不想打擾這個類。

回答

4

(請注意,我不希望把在sinefunc()類N.其 了已經寫好,我不想打擾這個類)

沒有功能移動到N類,你不能這樣做,,你可以有一個接口這將有方法簽名,但是你必須定義實現在每個班級。

要做到這一點的一種方法是寫一個擴展方法到類N,你可以在繼承類中使用它。

編輯:

定義一個靜態類來保存,如擴展方法:

public static class ExtensionClass 
{ 
    public static void sinefunc(this N obj) 
    { 
     // your code 
    } 
} 

稍後,您可以把它想:

static void Main(string[] args) 
{ 
    A objA = new A(); 
    objA.sinefunc(); 
} 

請記住,包括命名空間是拿着擴展方法,否則它將不可見。您可以閱讀更多:Extension methods MSDN

+0

擴展方法是「C#ONIC」的方式來增加函數到N的多個子類而不改變N.也就是說,如果你有多個具有相同功能的子類,它似乎將它移到N中是非常正確的。 – theodox

+0

謝謝你讓我知道擴展方法Habib。這裏很新。..一些代碼示例將不勝感激。 –

+0

@nowhewhomustnotbenamed。,檢查編輯答案 – Habib

0

if sinefunc()是一個常用函數,爲什麼不把它放到另一個類中。例如,你可以把它在實用工具類的靜態方法

+0

是的,如果它的共同點可以完成。但在我的情況下,它不是 –

2

您可以創建充當門面N類中間體類:

class A : X { } 

class B : X { } 

class C : X { } 

class X : N 
{ 
    protected void sinefunc() 
    { 
      //some stuff here 
    } 
} 
+0

你是指多級繼承? –

+0

是的,因爲你不想和/或不能修改'N'的定義... – xandercoded

+0

謝謝你的另一種方式! –