簡體   English   中英

為什么在主要是非靜態的類中包括靜態成員?

[英]Why include static members within a primarily non-static class?

我很難理解將靜態成員包括在類中的總體原則是什么,該類通常充當實例化的藍圖。 我將使用一個示例:

假設您有汽車課。

Class Car
{
  public int yearBuilt;
  public string make;
  //etc
}

主要用於生產新車。 因此,如預期的和上面所示,您有一堆非靜態成員。 現在,假設您實例化了以下兩輛新車

Car.newCar1 = new Car();
Car.newCar2 = new Car();

現在,假設您遇到一種情況,您想為今天生產的新車分配/跟蹤供應商。 假設您一次只能擁有一個供應商,那么您認為此時制造的所有newCar都應該共享價值,因此您將其添加到Car類中:

public static string supplier = "American AutoCompany X";

我現在無法通過實例IE:newCar1.supplier來訪問它,否則它將更改newCar2的值(在這種情況下可以,並且更可取),而必須這樣做以實現相同的目標:

Car.supplier;

我不明白這一點。 為什么不將靜態方法/字段等保留在完全不同的類中,例如:

class AllStaticStuff
{
}

並從那里訪問它? 從組織上講,這甚至可能是更好的選擇,因為靜態成員無論如何都與實例化無關。 還是我錯過了一些基本問題,使這種組織方法比其價值更大的麻煩? 我想我不喜歡在非靜態類中包含靜態變量的想法的原因是,我嘗試避免在任何一個類中不必要地增加成員資格,因為出於可讀性考慮,我發現它更干凈。

實際上,這僅取決於您嘗試使用代碼創建的抽象。

如果使用期望在另一個類的所有實例之間共享的數據創建一個類,則無論如何都必須使該類靜態。 有時創建靜態成員比較干凈。

我認為您關於汽車的例子並不是一個很好的例子,因為對於汽車擁有“供應商”財產是沒有意義的,除非供應商在各個實例之間可能有所不同。

我認為一個更好的例子是保留一個擁有計數器的靜態成員。 想象一下,如果您要跟蹤一個類有多少個實例。 每次創建實例時,計數器都會遞增。 該類的所有實例都需要知道這個數字。 它僅與此類相關,所以為什么要為計數器數據創建一個單獨的類?

與AllStaticStuff.Counter相比,Car.Counter在邏輯上對人類更有意義。 更明顯。

我喜歡將靜態成員視為操作(有很多其他用途),但是可以說您擁有汽車對象,但是您需要做一些事情,例如獲取汽車圖像(無論年份和年份無關緊要,都可以找到它) ),您可以執行以下操作。

Class Car
{
   public int yearBuilt;
   public string make;

   public static string GetImageOfCar(Car c)
   {
     // File operations to find the correct image on the drive and return its path as a string   
     // use c.yearBuilt somewhere 
     // use c.make somewhere
   }
}

然后在類之外,當實例化car對象時,可以執行以下操作:

Car aCar = new Car();
aCar.yearBuild = 1983;
aCar.make = "Ford Truck";

MessageBox.Show(Car.GetImageOfCar(aCar)); // Would return the path to the image

就您的供應商名稱而言,我只是將其定義為屬於每個對象的另一個字段,因為“技術上”每輛汽車都可以有一個單獨的供應商。 我猜你可以做一個常數或其他的東西,但是你仍然想要某種領域來為我想的每個對象輕松地識別它。 您可以簡單地創建一個靜態字段,並在類之外隨時使用該值。 在“汽車”課程中,您需要輸入以下內容:

public static string Supplier = "name of supplier";

然后使用以下方法在類外部訪問它:

MessageBox.Show(Car.Supplier);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM