gpt4 book ai didi

一个列表中的 C# 不同类对象

转载 作者:太空狗 更新时间:2023-10-29 19:59:59 25 4
gpt4 key购买 nike

我已经环顾四周以找到解决此问题的方法。我找到了几种可以解决它的方法,但老实说,我没有意识到哪种方法被认为是“正确的”C# 或 OOP 解决方法。我的目标不仅是解决问题,而且是制定一套良好的代码标准,我相当确定有一种标准的方法来处理这个问题。

假设我有 2 种类型的打印机硬件及其各自的类和通信方式:PrinterType1、PrinterType2。

如果需要,我还希望稍后能够添加另一种类型。在抽象上更上一层楼,它们有很多共同点。作为示例,应该可以向它们中的每一个发送一个字符串。它们都有共同的变量和每个类独有的变量。 (例如,一个通过 COM 端口进行通信并具有此类对象,而另一个通过 TCP 进行通信并具有此类对象)。

然而,我只想实现所有这些打印机的列表,并能够遍历列表并在所有打印机上执行“发送(字符串消息)”操作,而不管类型如何。我还想访问两个对象相同的变量,如“PrinterList[0].Name”,但是我也想在某些地方访问特定于对象本身的数据(例如在设置窗口中为一个对象设置 COM 端口名称并为另一个对象设置 IP/端口号的应用程序)。

所以,简而言之:

共同点:

  • 姓名
  • 发送()

特定于 PrinterType1:

  • 港口

特定于 PrinterType2:

  • 知识产权

例如,我希望对所有对象执行 Send(),而不管存在的对象类型和数量。

我读过有关多态性、泛型、接口(interface)等的内容,但我想知道在我看来,基本问题通常如何在 C#(和/或一般的 OOP)中处理。

我确实尝试过创建一个基类,但我觉得不太合适。例如,我没有在基类本身中使用“string Send(string Message)”函数。那么,为什么我要在那里定义一个需要在派生类中覆盖的函数,而我一开始就永远不会在基类中使用该函数?

我真的很感谢任何答案。周围的人似乎知识渊博,这个地方早些时候为我提供了很多解决方案。现在我终于有了一个可以回答和投票的帐户。

编辑:

另外解释一下,我还希望能够访问实际打印机类型的对象。例如,PrinterType1 中的 Port 变量是一个 SerialPort 对象。我想像这样访问它:PrinterList[0].Port.Open()

并可以访问底层端口的全部功能。同时,我想调用对不同对象(但具有不同实现)以相同方式工作的通用函数:

foreach (printer in Printers)
printer.Send(message)

最佳答案

使用接口(interface)的伪示例。

public interface IPrinter
{
void Send();
string Name { get; }
}

public class PrinterType1 : IPrinter
{
public void Send() { /* send logic here */ }
public string Name { get { return "PrinterType1"; } }
}

public class PrinterType2 : IPrinter
{
public void Send() { /* send logic here */ }
public string Name { get { return "Printertype2"; } }

public string IP { get { return "10.1.1.1"; } }
}


// ...
// then to use it
var printers = new List<IPrinter>();

printers.Add(new PrinterType1());
printers.Add(new PrinterType2());

foreach(var p in printers)
{
p.Send();

var p2 = p as PrinterType2;

if(p2 != null) // it's a PrinterType2... cast succeeded
Console.WriteLine(p2.IP);
}

关于一个列表中的 C# 不同类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13687321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com