为什么在主要非静态类中包含静态成员?

时间:2014-07-18 20:48:31

标签: c# static encapsulation

我无法理解在一个通常充当实例化蓝图的类中包含静态成员的主要原则是什么。我将使用一个例子:

说你有汽车课。

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

主要用于生产新车。所以你有一堆非静态成员,正如预期和上面所示。现在,假设您实例化以下2辆新车

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

现在,假设您想要为今天制作的newCar分配/跟踪供应商。假设您在任何时候只能拥有一个供应商,那么您认为此时制作的所有newCar应该共享该值,因此您将添加到Car类:

public static string supplier = "American AutoCompany X";

我现在无法通过实例IE:newCar1.supplier访问它,否则它会更改newCar2的值(在此上下文中是正常的并且更可取),而是必须执行此操作才能完成同样的目标:

Car.supplier;

我不明白这一点。为什么不将静态方法/字段等保存在完全不同的类中,如:

class AllStaticStuff
{
}

从那里访问它?在组织上甚至可能是优选的,因为静态成员无论如何都与实例化无关。或者我错过了一些基本原因,这使得这种组织方法比它的价值更麻烦?我想我不喜欢将静态类包含在非静态类中的原因是我试图避免在任何一个类中不必要地增加成员资格,因为为了可读性,我发现它更清晰。

2 个答案:

答案 0 :(得分:1)

这完全取决于您尝试使用代码创建的抽象。

如果您创建的类包含您希望在另一个类的所有实例之间共享的数据,则无论如何都必须使该类保持静态。有时创建静态成员会更简洁。

我认为您的汽车示例并不是很好,因为除非供应商可能因实例而异,否则拥有供应商财产是没有意义的。

我认为,一个更好的例子是保留一个持有计数器的静态成员。想象一下,如果您要跟踪已打开的班级的实例数。每次创建实例时,计数器都会递增。该类的所有实例都需要知道这个数字。它只与这个类有关,那么为什么只为计数器数据创建一个单独的类?

Car.Counter对人类的理解比AllStaticStuff.Counter更有意义。这更明显。

答案 1 :(得分:0)

我喜欢将静态成员视为操作(还有很多其他用途),但我们可以说你拥有自己的汽车用品,但是你需要做一些像汽车一样的事情(无论什么年份和制造无关紧要,它可以找到它,你可以做这样的事情。

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 aCar = new Car();
aCar.yearBuild = 1983;
aCar.make = "Ford Truck";

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

就您的供应商名称而言,我只是制作属于每个对象的另一个字段,因为每辆车“技术上”可以有一个单独的供应商。我猜你可以做一个常数或者其他东西,但你仍然想要某种字段来轻松地为我认为的每个对象识别它。你可以简单地创建一个静态字段,并在你想要的时候在类之外使用该值。在Car类中,您可以输入类似的内容:

public static string Supplier = "name of supplier";

然后使用以下方法在课堂外访问:

MessageBox.Show(Car.Supplier);