c# - 如何实现许多具有相同方法但做事不同的类?

标签 c# oop

我是一名开发人员,主要使用嵌入式设备(使用 C 语言和汇编语言编程)。我的 C# 和 OOP 知识非常有限(尽管我可以在必要时假装自己的方式)。我有五台设备通过 USB 与 PC 连接。 PC 进行一些计算并将结果发送到设备。对每个设备执行相同的计算,但计算方式不同。对于每台设备,我都有一个 C# Windows 窗体应用程序,它可以执行一些工作并将数据来回发送到设备。目前,我正在尝试将五个不同的应用程序合并为一个,以便我们可以轻松地进行更改、轻松添加新设备并拥有标准的用户界面。我的问题是我不完全知道最好的方法,因为我不知道在运行时将使用哪个设备。我试图避免一堆 if 语句,我希望能够将每个设备放在一个单独的文件中。这是我正在谈论的一些伪代码。

class Device //This is what EVERY device can do
{
...
DoWork1();
DoWork2();
DoWork3();
...
}

class Device1
{
...
DoWork1(); //This is how the work is done for this device
DoWork2();
DoWork3();
...
}

class Device2
{
...
DoWork1();  //This is how the work is done for this device (not the same way as   Device1)
DoWork2();
DoWork3();
}


public partial class frmMain : Form
{
private (some kind of object or something) CurrentDevice;
public frmMain()
{
...
//Determine what device (could be one of five) is currently being used
CurrentDevice = (which device is currently being used)
//Could be CurrentDevice = new Device1();
}
}

private void Button1_Click()
{
CurrentDevice.DoWork1(); //But this could be Device1.DoWork1() or Device2.DoWork1(), depending on what device is currently being used (which was determined in the frmMain constructor)
}

我不太确定,但我想我可以使用一个接口(interface),或者可以为 Device 类继承 Device1 类并重写这些方法...但我不知道如何使用一种通用方法说 CurrentDevice.DoWork1() 因为 CurrentDevice 可能是 Device1 或 Device2。

任何想法将不胜感激。我在 Windows XP SP3 和 Windows 7 上使用带有 .NET 3.5 的 Visual Studio 2008。

我希望我对问题的描述足够好。如果没有,或者如果我没有提到我应该提到的事情,请告诉我。我是 stackoverflow 和 C# 的新手。

谢谢,

迈克尔

最佳答案

在您的情况下,您基本上是在定义一个继承层次结构,它可以由一个抽象基类和两个派生类型组成,也可以由一个具有它的两个实现者的接口(interface)组成。例如

public abstract class BaseDevice
{
    public abstract void DoWork1();
}

public class Device1 : BaseDevice
{
    public override void DoWork1()
    {
        // provide implementation here
    }
}

// also create Device2 : BaseDevice and implement 

或者你可以使用接口(interface)定义

public interface IDevice
{
    void DoWork1();
}

public class Device1 : IDevice
{
    public void DoWork1() 
    {
        // provide implementation 
    }
}

您选择哪种方法取决于您。例如,如果您想要定义一些具有在整个层次结构中通用的实现的行为或属性,您可能会喜欢抽象基类。使用抽象类,您可以提供实现。接口(interface)是一个空契约,您不能提供任何通用行为,只能定义可能存在的行为或属性。

无论采用哪种方式,您都可以通过抽象或接口(interface)基引用更多派生类型的实例。通过这种方式,您不关心实现类型是什么,只关心它可以做什么(它是方法或属性)。

例子:

 BaseDevice device1 = new Device1(); 
 BaseDevice device2 = new Device2();
 // maybe you have a list?
 List<BaseDevice> devices = new List<BaseDevice> { device1, device2 };

 foreach (BaseDevice device in devices)
 {
      device.DoWork1(); // notice you don't care about the actual type, just the behavior
 }

关于c# - 如何实现许多具有相同方法但做事不同的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5827917/

相关文章:

c# - 由外部服务触发时恢复 Bot Framework 对话框

c# - 我对新添加的 dll 引用使用什么 using 指令

java - 类结构应该匹配 OOP 中的表结构吗?

excel - VBA 第一次创建类

oop - 如何使用接口(interface)获取对象的子集?

c# - 读取 XML 和未声明的命名空间

c# - C#中的多重继承问题

c# - 要 float 的字节数组

php - 为什么 PHP 不允许私有(private) const?

javascript - 如何在 JavaScript 上访问 "this"的父级?