2012-05-25 36 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。这个很酷。

我可能会推荐一个通用接口,至少在你的例子中,但如果你想要更复杂和更通用的东西,反射是要走的路。