传递3种不同数据类型的方法做同样的事情?

时间:2013-07-25 14:00:08

标签: c# oop data-structures

我认为标题可能有误......哈哈不确定..反正..

我有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;
    }
}

这显然不会起作用..但它只是一个例子......

我怎么能真正做到这一点?

由于

3 个答案:

答案 0 :(得分:7)

考虑创建类层次结构,并将方法 Something 移动到该层次结构。基类:

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

    public abstract void Something();
}

两个派生类 Data1 Data2

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
    }
}

现在,当您拥有这些类的实例时,您只需在每个项目上调用 Something ,而无需确定其类型。每个项目都将包含完成操作所需的所有变量:

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

答案 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
}

作为补充说明,我假设您将使用属性和类等的命名约定。

答案 2 :(得分: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());

我建议使用第一个选项。