3

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

但这是我的问题:

假设我有一个类,我们称它为“计算机”,它保存公司中所有计算机的数据。现在,碰巧这家公司拥有数千台戴尔计算机和数千台惠普,仅此而已。(再次请坚持我,这只是一个例子来说明我的观点)

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

Public Class Computer

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

End Class

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

Dim DellComps as new list(of computer)
Dim HPComps as new list(of computer)

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

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

我的想法是:

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

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

4

3 回答 3

5

您最接近的事情是使用abstract关键字。您将有一个抽象类Computer,然后将被具体的子类DellComputer和覆盖HpComputer。一个粗略的(C#)示例是:

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

public class DellComputer : Computer 
{
    public DellComputer()
    {
       this.Type = "Dell"
    }
}

您通常不希望在大量实例之间共享单个变量,因为这会破坏封装,并且在尝试对代码进行单元测试时更现实地可能会成为一个大问题。因此,您所说的纯粹形式并不是一个非常好的主意,但实际用例非常普遍,并且绝对受支持。

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

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

public class DellComputer : Computer 
{
    public override string Type 
    {
        get {
           return "Dell";
        }
    }
}
于 2012-10-26T19:05:10.997 回答
2

如果您总是在构造函数中设置一个标志来指示计算机的类型(这不是典型的业务对象场景,可以编辑类型),那么您很可能可以使用子类真正解决您的问题。

子类计算机以创建 DellComputer 和 HpComputer 类。

在创建每种计算机类型的列表时,一种方法是拥有所有计算机的主列表,并使用 Linq 的Enumerable.OfType(TResult)来选择与您感兴趣的类型匹配的实例。

如果您确实希望在创建类后可以编辑类的类型,请改为提供一个属性来修改计算机的类型。为方便起见,您可以提供一个也设置属性的构造函数重载(尽管我个人会回避)。如果这样做,请让构造函数重载使用该属性来设置类型。

更新

工厂模式可能是什么样子的示例。

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

public class DellComputer : Computer 
{
    public override string Type 
    {
        get { return "Dell"; }
    }
}

public class HpComputer : Computer 
{
    public override string Type 
    {
        get { return "HP"; }
    }
}

// Here I'm using an enum to indicate the type desired.  You might use a string
// or anything else that makes sense in your problem domain.

public enum ComputerType
{
    Dell = 1,
    Hp = 2
}

public class ComputerFactory
{
    public Computer Create(ComputerType type)
    {
        switch (type)
        {
            case ComputerType.Dell:
                return new DellComputer();
            case ComputerType.Hp:
                return new HpComputer();
            default:
                throw new InvalidArgumentException();
        }
    }
}

// Usage would be something like:


List<Computer> computers = new List<Computer>();
computers.Add(ComputerFactory.Create(ComputerTypes.Dell);
computers.Add(ComputerFactory.Create(ComputerTypes.Dell);
computers.Add(ComputerFactory.Create(ComputerTypes.Hp);
于 2012-10-26T18:58:41.130 回答
0

您可以创建一个具有集合和其他数据的类。在这种情况下,PC 将没有类型。

public class Computers 
{
     private List<Computer> pcs= new List<computer>();

     public List<Computer> PCs get { return { pcs; } };

     public String Brand { get; private set; }

     public Computers(string brand) {Brand = brand;}
}

关于静态变量。您不希望班级的所有成员共享品牌。

有了上面所说的,只需重复构造函数中的数据。
如果戴尔具有与 HP 相同的属性,那么我将使用相同的类。
如果你说购买一个新品牌,你真的想创建一个新的类或子类吗?
如果您想要一个结构化的品牌列表,那么我会使用 Enum 而不是每个品牌的单独类。

于 2012-10-26T19:00:35.637 回答