2013-07-25 52 views
1

我认为标题可能是错误的...哈哈..不清楚反正..方法传递3种不同的数据类型来做同样的事情?

我有3种不同的数据类型..

public class data1 
{ 
    public Color color; 
    public int len; 
    public DrawingVisual dv; 
    Other vars... 
} 
public class data2 
{ 
    public Color color; 
    public int len; 
    public DrawingVisual dv; 
    Other vars different from data1 vars... 
} 

等...

如何创建一个功能在通过这些,然后得到我所需要的功能.. 例内瓦尔..

void Something(var data) 
{ 
    switch (typeof(data)) 
    { 
     case data1: 

     break; 
     case data1: 

     break; 
    } 
} 

这不会工作,显着..但它绝对举个例子..

我该怎么做到这一点?

感谢

+0

你在用什么方法处理数据?你打算使用'其他变种'吗? –

+0

'void Something(var data)'不是一个有效的语句。编译器应该抱怨。 –

回答

7

考虑创建类层次结构,并移动方法东西该层次结构。基类:

public abstract class Data 
{ 
    public Color color; 
    public int len; 
    public DrawingVisual dv; 

    public abstract void Something(); 
} 

和两个派生类数据1数据2

public class Data1 : Data 
{ 
    // Other vars... 

    public override void Something() 
    { 
     // Use base class data and other vars 
    } 
} 

public class Data2 : Data 
{ 
    // Other vars different from Data1 vars 

    public override void Something() 
    { 
     // different implementation 
    } 
} 

现在,当你有这些类的实例,你可以简单地调用东西上的每个项目,但不尝试以确定其类型。每个项目将拥有所有必需的变量来完成的动作:

所有的
List<Data> items = // get list of Data1 and Data2 
foreach(Data data in items) 
    data.DoSomething(); 
+1

+1。甚至没有想过要移动'Something'方法。 -_- –

+1

我认为这是我想要的..我从来没有能够像这样的东西出来帮忙..谢谢.. –

+1

+1。这显示了在这种特殊情况下良好的面向对象操作。 –

1

可以使用object代替var

void Something(object data) 
{ 
    if(typeof(data) == data1.GetType()) 
    { 

    } 
    else 
    if(typeof(data) == data2.GetType()) 
    { 

    } 
} 

你的类似乎他们可以使用继承的公共属性。创建一个基本的抽象类并继承它。

public abstract class Data 
{ 
    public Color color; 
    public int len; 
    public DrawingVisual dv; 

    public abstract void Something(); 
} 

public class Data1 : Data 
{ 
     //Addition methods go here 
} 

public class Data2 : Data 
{ 
     //Addition methods go here 
} 

作为一个附加的注释我假设你将使用符合命名约定的属性和类等

+0

谢谢,我忽略了这个......哈哈......你会说这是最好的方法吗? –

1

首先,你可能想利用公共领域重新考虑和使用公共属性,而不是。你可能会考虑两个选项。

实现共享接口

同时考虑你的类具有相同的属性,你可以有一个接口:

public interface IData 
{ 
    Color color {get;set;} 
    int len {get;set;} 
    DrawingVisual dv {get;set;} 
} 

public interface Data1 
{ 
    public Color color {get;set;} 
    public int len {get;set;} 
    public DrawingVisual dv {get;set;} 
} 

public interface Data2 
{ 
    public Color color {get;set;} 
    public int len {get;set;} 
    public DrawingVisual dv {get;set;} 
} 

void Something(IData data) 
{ 
    // use the properties defined in the IData interface 
} 

Something(new Data1()); 
Something(new Data2()); 

使用方法重载

void Something(data1 data) 
{ 
    // Do something specific using data1 class 
} 

void Something(data2 data) 
{ 
    // Do something specific using data2 class 
} 

Something(new data1()); 
Something(new data2()); 

我d建议使用第一个选项。

+0

为什么要实施3个相同的合同?只是为了区分类型?我建议创建抽象类并在@lazyberezovsky所做的每个子类中实现专门的方法。 –

+0

@MechanicalObject它是_one_选项。我不是说这是_ideal_。如果克里斯不能重构课堂,它仍然是一个有效的选择。 –

+0

这一切都很好..这里的每一篇文章都会帮助我修复我的课程,以便更好地完成课程。现在,我的东西就像是面包上的果冻一样..我想把所有东西都搬到下一步.. –

相关问题