理想的面向对象设计

时间:2016-06-07 18:31:54

标签: c# oop

我意识到这有一个非常广泛的标题。

我对OO的了解缺乏,因为我认为我的概念是正确的,但我几年没有这样做了。

我正在创建一个自定义PerformanceMonitor,可以从您的计算机硬件中读取实时信息。我编码这是C#。示例类:

namespace PerformanceMonitor
{
    public static class Machine
    {
        public static CPU cpu { get; set; } = new CPU();
        public static RAM ram { get; set; } = new RAM();
        public static List<GPU> gpus { get; set; } = new List<GPU>();
        public static List<Drive> drives { get; set; } = new List<Drive>();

        static Machine() {}
    }
}

CPU

namespace PerformanceMonitor
{
    public class CPU
    {
        public List<CPUCore> cpuCores { get; set; } = new List<CPUCore>();
        public bool HyperThreaded { get; set; } = false;

        public int ClockBusSpeed_current { get; set; }
        public int ClockBusSpeed_max { get; set; }

        public int TemperaturePackage_current { get; set; }
        public int TemperaturePackage_max { get; set; }

        public int LoadTotal_current { get; set; }
        public int LoadTotal_max { get; set; }

        public int PowerPackage_current { get; set; }
        public int PowerPackage_max { get; set; }

        public int PowerGraphics_current { get; set; }
        public int PowerGraphics_max { get; set; }

        public int PowerDRAM_current { get; set; }
        public int PowerDRAM_max { get; set; }

        public int PowerCores_current { get; set; }
        public int PowerCores_max { get; set; }

        public CPU() {}
    }
}

CPUCore

namespace PerformanceMonitor
{
    public class CPUCore : CPU
    {
        public CPUCore() {}
    }
}

计算机是一个顶级课程,如果你愿意的话。每次创建Machine实例时,也会创建列出的所有其他类的实例。例如,如果您想设置CPU是超线程的,那么您可以在 Program.cs 中执行此操作:

private static Machine machine = new Machine();
...
if (NumberOfCores * 2 == NumberOfLogicalProcessors) {
    machine.cpu.HyperThreaded = true;
}

因此,您将通过Machine类访问所有内容。

每次运行程序时,每个类只会创建一个实例(CPUCore,GPU和Drive除外 - 这就是我尝试使用static的原因)

计算机类(因此,任何类)只能通过程序类访问。此类也是唯一一个与WMI交互以获取所需信息的类。

我的问题是:

  • 即使每个类的构造函数中没有任何内容,实例是否会看到该类具有这些特定属性,或者它们是否必须在构造函数中新创建?即:

    public static CPU cpu { get; set; } ... static Machine() { cpu = new Cpu(); }

  • 我在这里正确使用'static'关键字吗?

  • 我是否可以将类列表实现为静态,即使类本身不是?即:

    public static List<GPU> gpus

  • 我是否还应该在任何这些类中实现关键字sealed,以便无法覆盖它们?

我意识到这是一个问题所以如果您认为最好将我指向一个关于OOP /设计模式的书籍/网站,那么就这样做。

另外,如果你看到我的OO设计出现了我无法看到的错误,请指出。谢谢!

1 个答案:

答案 0 :(得分:0)

  

即使每个类的构造函数中没有任何内容,实例是否会看到该类具有这些特定属性,或者是否必须在构造函数中新创建它们?

你问的是默认情况下是否会将属性初始化为新实例,在这种情况下,答案是否定的。需要初始化属性,或者它们将具有默认值,对于引用类型,它是null

  

我在这里正确使用'static'关键字吗?

可能不是,但这只是基于您问题中的其他评论。在需要之前,我首先不要将任何静态化。

  

我是否可以将类列表实现为静态,即使类本身不是?

你能吗?当然 - 该属性然后绑定到,而不是特定的实例。你应该?这完全取决于使用情况。同样,首先不要将其设置为静态,并在需要时进行更改。

  

我是否还应该在任何这些类中实现关键字sealed,以便不能覆盖它们?

virtual吗?或者您依赖于ToStringEquals等继承的虚拟方法?如果是这样,你想要防止任何继承的类弄乱它,那么肯定,密封你的类。