2012-05-25 79 views
0

我有兩個函數可以在兩個不同的類上做基本相同的事情......每個類都有不同的屬性。如何將兩個相似的功能組合成一個功能?

例如:

public class ClassA 
{ 
    public int ColorID {get;set;} 
    public string ColorDescription {get;set;} 
} 

public class ClassB 
{ 
    public int TypeID {get;set;} 
    public string TypeDescription {get;set;} 
} 

public void ExFunctionSaveA(ClassA aClass)  
{ 
    aClass.ColorID=1; 
    aClass.ColorDescription="My Color"; 
    Save(); 
} 

public void ExFunctionSaveB(ClassB bClass)  
{ 
    bClass.TypeID=2; 
    bClass.TypeDescription="My Type"; 
    Save(); 
} 

正如你所看到的類和函數具有相同類型的結構,只是屬性名稱是不同的...但我覺得我是在重複的代碼做這個

有沒有一種方法,使ExFunctionA和ExFunctionB成一個功能,這樣我就可以用這個具有類似的結構

我知道我可以做一些通用的東西像

所有類
public void ExFunctionSave<T>() // T is either ClassA or ClassB 
{ 
    . 
    . 
    . 
    . 
    Save(); 
} 

,但我會如何處理每個

+0

已經建議的接口/繼承之外。我將使用每個類中的構造函數來設置各個屬性的ID和說明。這隻會留下Save()方法,除非您有基類或泛型基類,否則無法刪除它。 – JonWillis

回答

2

如果你可以改變你的類的定義,那麼最好的辦法是讓他們實現一個通用的接口,其中包含你想要的屬性訪問:

public interface IDescribable 
{ 
    int ID { get; set; } 
    string Description { get; set; } 
} 

public class ClassA 
{ 
    public int ID { get; set; } 
    public string Description { get; set; } 

    public int ColorID 
    { 
     get { return ID; } 
     set { ID = value; } 
    } 

    public string ColorDescription 
    { 
     get { return Description; } 
     set { Description = value; } 
    } 
} 

public class ClassB 
{ 
    public int ID { get; set; } 
    public string Description { get; set; } 

    public int TypeID 
    { 
     get { return ID; } 
     set { ID = value; } 
    } 

    public string TypeDescription 
    { 
     get { return Description; } 
     set { Description = value; } 
    } 
} 

public void ExFunctionSave(IDescribable d, int id, string desc)  
{ 
    d.ID = id; 
    d.Description = desc; 
    Save(); 
} 
+0

這工作.....我實際上是使用Linq類..所以我實際上在他們的每個部分類中實現此....作品像一個魅力....感謝 –

0

僅此而已,你可以做,除非在2類實現其具有的功能相同的接口的屬性。就你而言,即使功能簽名也不同。

0

您可以使用屬性ID和描述來定義接口。 具有此結構的類可以實現該接口。 而你的方法接收參數的接口和執行方法...

5

而不是使用泛型,爲什麼不使用繼承來解決這個問題?

public class theBase 
{ 
    string ID; 
    string Description; 
} 
public class theColor : theBase 
{ 
} 

public class theType : theBase 
{ 
} 

public void ExFunctionSaveA(theBase base)  
{ 
    base.ID=1; 
    base.Description="My Color"; 
    Save(); 
} 
0

看看Reflection

反思會讓你的代碼收到ClassA,發現它有一個ColourID和一個ColorDescription。同樣,當您收到ClassB時,您可以發現其TypeIDTypeDescription。這個很酷。

我可能會推薦一個通用接口,至少在你的例子中,但如果你想要更復雜和更通用的東西,反射是要走的路。