列表类的类结构?

时间:2011-01-19 15:14:48

标签: c# oop class class-design

我正在寻找一些类结构帮助。让我们说我有一个名为Dog的班级有关于狗的信息(名称,体重,类型),但因为可能有多只狗,我还想要一个班级来容纳所有这些狗,以便在整个项目中使用。这是最好的方法吗?

只是要有一个DogList类,它将Dog类信息存储到公共列表中?允许我随意取回它?

或者列表应该是原始狗类中的静态?也许在构造函数中,只要有人创建了一条新狗,狗就会进入静态列表?

编辑:对不起问题有点错过领先 这是我到目前为止的结构,想知道是否有更好的实施方法。

public class Dog
{
    public string name{get;set;}
    public int weight { get; set; }
}

public class DogFactory //not sure if thats the correct wording
{
    public List<dog> lstDogs = new List<dog>();
    public void setDogs()
    {
    Animal.Retrieve("Dog"); 
    //will retrieve a list of all dogs, with details, though this is costly to use
        foreach(Animal.Dog pet in Animal._Dogs)
        {
            Dog doggie = new doggie();
            doggie.Name = pet.Name;
            ...etc
            lstDog.add(doggie);
        }
    }
}

3 个答案:

答案 0 :(得分:5)

制作狗列表的最简单方法是:

List<Dog>

这是使用System.Collections.Generic中的List<T>类的强类型狗列表。你可以上课:

public class DogList : List<Dog>

虽然通常不需要这样做,除非您想要特别添加狗的列表属性,而不是狗本身。

更新:

使用List<T>时,通常不需要创建专用列表类。在大多数情况下,您可以这样做:

public class DogService
{
    public List<Dog> GetAllDogs()
    {
        var r = new Repository(); // Your data repository
        return r.Dogs.ToList();   // assuming your repository exposes a 'Dogs query'
    }
}

如果您使用LINQ来获取数据,则可以使用ToList()扩展名返回List<T>,因此无需创建派生自List<T>的类。

答案 1 :(得分:3)

嗯,C#已经有了一个非常好的List<>类,所以除非你有非常具体的需求,否则我不会选择新的DogList类。如果你需要跟踪所有创建的Dogs,那么dog类中的静态列表就可以了。只要确保它保持private并且你有添加或检索狗的方法。更好的是,您的狗工厂可以将它们添加到列表中(我现在看到您自己提到)。

答案 2 :(得分:1)

  

或者列表应该是静态的   原来的狗类?也许在   构造函数,任何人创建   一只新的狗,狗被放入了   静态列表?

此解决方案适用于单线程应用程序,但它会让您接触all the dangers of global variables

这也是一个糟糕的抽象 * :什么时候Dog类包含任何调用者在运行时构建的所有狗的列表是否有意义?如果调用者取消分配Dog实例会发生什么?

相反,使用狗列表的呼叫者应明确承担创建和管理它的责任。那些呼叫者将知道列表的正确生命周期,他们将能够控制列表中的内容,此外,任何阅读代码的人都会明白发生了什么以及如何发生。

* 除非该列表应该是创建的狗的日志。