【问题标题】:Method to pass 3 different data types to do the same thing?传递 3 种不同数据类型来做同样事情的方法?
【发布时间】:2013-07-25 14:00:07
【问题描述】:

我认为标题可能是错误的..哈哈不确定..无论如何..

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

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

我该怎么做呢?

谢谢

【问题讨论】:

  • 你对Something方法中的数据做了什么?你打算使用“其他变量”吗?
  • void Something(var data) 不是有效的声明。编译器应该抱怨。

标签: c# oop data-structures


【解决方案1】:

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

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

    public abstract void Something();
}

还有两个派生类Data1Data2

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();

【讨论】:

  • 我想这就是我想要的。如果没有帮助,我永远无法解决这样的问题。谢谢。。
  • 如果我的数据上有 INotifyPropertyChanged .. 我还能这样做吗?如果我这样做似乎它不起作用..
  • @ChrisFazzio This 可能会给你洞察力。
【解决方案2】:

首先,您可能需要重新考虑使用公共字段并改用公共属性。您可能会考虑两种选择。

实现共享接口

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

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());

我建议使用第一个选项。

【讨论】:

  • 为什么要执行 3 个相同的合约?只是为了区分类型?我建议像@lazyberezovsky 那样在每个子类中创建抽象类并实现专门的方法。
  • @MechanicalObject 是一个选项。我并不是说它是理想的。如果 Chris 无法重构该类,它仍然是一个有效的选项。
  • 一切都很好。。这里的每一篇文章都将帮助我改进我的课程以更好地表现。现在我的东西就像果冻拍在面包上一样。我想把所有东西都移到下一步。 .
  • 你能解释一下为什么我应该使用接口而不是类吗?我会在网上研究一下。。谢谢
  • @ChrisFazzio 从概念上讲,如果你有共同的行为,你想使用一个接口(飞机和鸟都可以“飞行”并实现 IFly 接口,但飞机不是鸟反之亦然)关系和类继承,如果你有一个“is-a”关系和组合,如果你有一个“has-a”关系。你可以看看this SO for more details
【解决方案3】:

您可以使用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
}

作为附加说明,我假设您将遵循属性和类等的命名约定。

【讨论】:

  • 谢谢,我忽略了这个……哈哈……你说这是最好的方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多