我意識到這有一個非常廣泛的標題。理想的面向對象的設計
我的面向對象的知識缺乏,因爲雖然我認爲我的概念是正確的,但幾年後我還沒有做到。
我正在創建一個定製的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設計中看到一個我沒有看到的錯誤,請指出。謝謝!
「每次創建一個機器的實例」 - 「機器」是一個靜態類,所以沒有_機器的實例。它只是一個靜態屬性和方法的容器。 –