如何使用c#列出OOP方式

时间:2015-12-11 04:28:45

标签: c# oop

我正在寻找一个例子,但我不知道我是否正确行事,这让我很难理解OOP。即时创建应用程序。即时尝试创建一个仪表板,如我的调制解调器(这是一个USB调制解调器)我用这个连接到互联网发送短信它是一个华为e353

这是我的代码,但我怎样才能将其转换为OOP。我正在学习OOP。我带了一本书,但没有动手就很难理解,所以即时创建这个应用程序。

ModemReader.cs

class ModemReader
{
    public List<string> list = new List<string>();
    public void DetectModem(){

        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_POTSModem");
        foreach (ManagementObject queryObj in searcher.Get()){
            if ((string)queryObj["Status"] == "OK"){
               list.Add(queryObj["AttachedTo"] + " - " + System.Convert.ToString(queryObj["Description"]));
            }
        }
    }
}

以我的形式

private void button1_Click(object sender, EventArgs e)
{
    ModemReader detect = new ModemReader();
    detect.DetectModem();
    foreach (string value in detect.list)
    {
        comboBox1.Items.Add(value);
    }
}

之后我计划使用At命令与调制解调器进行通信

3 个答案:

答案 0 :(得分:1)

这是一个非常基于意见的问题,看起来更像是代码审查。

第一个重要的事情是你需要使用属性,为它使用大写名称并使其成为只读,因为你不希望其他人在类之外修改你的列表:

// C# 6.0 syntax, initialize in constructor for earlier versions
public List<string> Result { get; } = new List<string>();

另一个注意事项是您实际上不使用List,它仅用于保存方法执行的结果。为什么不让你的方法返回呢?

public static class ModemReader // or not static. it's up to you
{
    public static string[] DetectModems() // I would use string[] because you won't modify it
    {
        List<string> result = new List<string>();

        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_POTSModem");

        foreach (ManagementObject queryObj in searcher.Get()){
            if ((string)queryObj["Status"] == "OK"){
               result.Add(queryObj["AttachedTo"] + " - " + System.Convert.ToString(queryObj["Description"]));
            }
        }

        return result.ToArray();
    }
}

并以这种方式使用它:

var modems = detect.DetectModems();
comboBox1.Items.AddRange(modems);

注意:正如我已经说过的那样,OOP-way不是truefalse。作为OOP也并不意味着“变得更好”或“更正确”。任何方法和任何关节组织在不同情况下可能更好或更差。此外,我的更正使您的计划“减少OOP” 我刚刚给出了我的观察并描述了一种方法,如果我开发它,我将使用它,它远非一个好的方法。您无需尝试按照某些规则执行所有操作 - 只需轻松使用即可。

答案 1 :(得分:1)

面向对象编程是使用对象(您有一个字符串对象列表),它们是动态的或编程的,而不是静态的。你所展示的我会考虑面向对象的设计,因为你可以根据变量输入动态检测和添加新对象到你的程序,

如果你得到输入然后做一个大量的检查列表然后在添加它或忽略它之后忽略输入并继续那么不是面向对象的编程。

OO是关于数据结构,比如列表,数组或树来存储数据并使用它而不是执行1个特定操作并删除任何你不再需要的东西

很抱歉没有添加评论,但我还没有足够的声誉

答案 2 :(得分:0)

2美分。

public interface IModem
{
    string GetName();
}

class HuaweiModem : IModem
{
    public string Name { get; set; }

    public string GetName()
    {
        return Name;
    }
}

interface IModemReader
{
    List<IModem> DetectModems();
}

public class WmiModemReader : IModemReader
{
    public List<IModem> DetectModems()
    {
        List<IModem> result = new List<IModem>();
        var searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_POTSModem");
        foreach (var queryObj in searcher.Get())
        {
            if ((string)queryObj["Status"] == "OK")
            {
                IModem modem = new HuaweiModem()
                {
                    Name = queryObj["AttachedTo"] + " - " + Convert.ToString(queryObj["Description"])
                };
                result.Add(modem);
            }
        }
        return result;
    }
}

然后在您的程序中使用如下:

IModemReader modemReader = new WmiModemReader();
var modems = modemReader.DetectModems();
foreach (var modem in modems)
{
    comboBox1.Items.Add(modem.GetName());
}

在这种方法中,您可以看到OOP的一些概念,如继承,多态。