我意识到这有一个非常广泛的标题。
我对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设计出现了我无法看到的错误,请指出。谢谢!
答案 0 :(得分:0)
即使每个类的构造函数中没有任何内容,实例是否会看到该类具有这些特定属性,或者是否必须在构造函数中新创建它们?
我想你问的是默认情况下是否会将属性初始化为新实例,在这种情况下,答案是否定的。需要初始化属性,或者它们将具有默认值,对于引用类型,它是null
。
我在这里正确使用'static'关键字吗?
可能不是,但这只是基于您问题中的其他评论。在需要之前,我首先不要将任何静态化。
你能吗?当然 - 该属性然后绑定到类,而不是特定的实例。你应该?这完全取决于使用情况。同样,首先不要将其设置为静态,并在需要时进行更改。我是否可以将类列表实现为静态,即使类本身不是?
我是否还应该在任何这些类中实现关键字
sealed
,以便不能覆盖它们?
有virtual
吗?或者您依赖于ToString
或Equals
等继承的虚拟方法?如果是这样,你想要防止任何继承的类弄乱它,那么肯定,密封你的类。