2016-06-07 84 views
1

我意识到这有一个非常广泛的标题。理想的面向对象的设计

我的面向对象的知识缺乏,因为虽然我认为我的概念是正确的,但几年后我还没有做到。

我正在创建一个定制的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; 
} 

所以,你会通过机械类访问一切。

每次程序运行时,只有1每个类的实例将被创建(除CPUCore,GPU和驱动器 - 这就是为什么我试图使用static

类(因此,任何班级)只能通过课程课程访问。这个类也将是唯一一个与WMI交互以获取所需信息的人。

我的问题是:

  • 即使没有在每个类的构造函数,将实例看到类有这些特定的属性或做他们必须在构造函数中新创建的?即:

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

  • 我使用了 '静态' 的关键字正确吗?

  • 我应该/还可以实现类的列表静态,即使类本身不是?即:

    public static List<GPU> gpus

  • 是否也应该实施这些类的关键字sealed所以他们不能被重写?

我意识到这是一起问题,所以,如果你认为这是更好的对OOP /设计模式一书/网站点我那么这样做。另外,如果你在我的OO设计中看到一个我没有看到的错误,请指出。谢谢!

+1

“每次创建一个机器的实例” - “机器”是一个静态类,所以没有_机器的实例。它只是一个静态属性和方法的容器。 –

回答

0

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

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

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

可能不是,但这只是基于您的问题中的其他意见。我会开始不什么静态,直到你需要到。

我应该/还可以实现类的列表静态,即使类本身不是?

你能吗?当然 - 该财产然后绑定到类别,而不是具体的实例。你应该?这完全取决于使用情况。同样,首先不要使其变为静态,并在需要时进行更改。

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

是什么virtual?或者你是否依赖于继承的虚拟方法,如ToStringEquals?如果是这样,并且你想阻止任何继承的类将其搞乱,那么确定,密封你的类。

+0

因此对于第一个问题,我的意思是我可以引用'Machine.cpu'吗?因为我通过说'private CPU cpu = new CPU()'来引用Machine中的CPU类,那么我可以通过Machine的一个实例引用'cpu'吗?另外,如果我创建了多个Machine实例,但它的构造函数中仍然没有任何内容,它是否仍然是使用的CPU实例?例如,如果我在Machine的一个实例中设置'hyperthreaded = true',如果我没有在Machine的构造函数中创建另一个CPU实例,'hyperthreaded'在另一个Machine实例中也是'true'? – wmash

+0

无论如何,谢谢你的帮助!是否真的为我清理了一些东西?我忘记了为什么我没有使用'virtual'。我将删除所有出现的'static',然后在以后添加它 – wmash