我意识到这有一个非常广泛的标题。理想的面向对象的设计
我的面向对象的知识缺乏,因为虽然我认为我的概念是正确的,但几年后我还没有做到。
我正在创建一个定制的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设计中看到一个我没有看到的错误,请指出。谢谢!
“每次创建一个机器的实例” - “机器”是一个静态类,所以没有_机器的实例。它只是一个静态属性和方法的容器。 –