跨类的某些实例但不是其他实例的静态/共享变量

Joh*_*tos 3 .net c# vb.net

这可能只是我表现出我缺乏知识/糟糕的编程习惯,但我很想知道是否:a)这已经存在b)如果它不存在,如果这样做是不好的编程习惯

但这是我的问题:

假设我有一个类,我们称之为"计算机",它包含公司中所有计算机的数据.现在,恰巧这家公司拥有数千台戴尔电脑和数千台惠普,而不是别的.(再次请在这里坚持我,这只是一个例子来说明我的观点)

现在,我可以按如下方式定义我的类:

Public Class Computer

Dim Type as string
Dim SerialNumber as string
Dim User as String
...

End Class
Run Code Online (Sandbox Code Playgroud)

现在,在我的代码中,我创建了两个列表:

Dim DellComps as new list(of computer)
Dim HPComps as new list(of computer)
Run Code Online (Sandbox Code Playgroud)

显然,对于DellComps他们来说,所有人都将拥有.Type = "Dell",而且HPComps,所有人都将拥有.Type = "HP"

现在,我知道我可以很容易地在构造函数中设置这个变量,但是我想知道是否有更聪明的方法在类中声明变量 - 类似于VB Shared/C#Static语句,其中所有类的实例分享相同的变量.

我的想法是:

  1. 继承该类并在子类中创建共享变量
  2. 保持原样并在构造函数中声明Type var
  3. 也许这是可以通过某种方式通过接口完成的事情
  4. 最可能 - 我不知道的事情

谢谢,我希望我的要求是有道理的!

tme*_*ser 5

你最接近的是使用abstract关键字.您将有一个抽象类Computer,会再由具体的子类覆盖DellComputerHpComputer.粗略的(C#)示例是:

public abstract class Computer
{
    public string Type { get; protected set; }
}

public class DellComputer : Computer 
{
    public DellComputer()
    {
       this.Type = "Dell"
    }
}
Run Code Online (Sandbox Code Playgroud)

您通常不希望在大量实例中共享单个变量,因为这会破坏封装,并且在尝试单元测试代码时更加逼真地成为一个大问题.所以你所谈论的纯粹形式并不是一个非常好的主意,但实际的用例非常普遍,并且肯定得到支持.

编辑:作为下面的评论的一部分,这是一个使用非常密切相关的虚拟关键字的不同方法!

public abstract class Computer
{
    public virtual string Type { get; }
}

public class DellComputer : Computer 
{
    public override string Type 
    {
        get {
           return "Dell";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您要使用继承,那么根本不提供setter,并在所有子类型中重写getter以返回常量字符串.另外,不要忘记将属性设为虚拟.实际上,只需在构造函数中设置一个属性,就可以在实例的生命周期内更改属性.在**至少,你可以通过添加`ReadOnly`来防止这种情况. (4认同)