2016-06-07 117 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