我有一个我正在努力解决的问题。我正在设计一个课程,但我对oop不太熟悉。是否可以定义与类本身类型相同类型的列表?比如说我有一个狗类:
public class Dog
{
public string _name {get; set;};
public Dog (string, name)
{
_name = name;
}
public List<Dog> listOfDogs ()
{
// blah blah
}
}
这种结构有可能吗?如果是这样,怎么样?这是做这样的事情的正确方法吗?或者我应该创建另一个帮助类,通过创建单独的狗对象来简单地构建狗列表?
由于
答案 0 :(得分:0)
是否可以定义与类本身类型相同类型的列表?
这样的结构可能吗?
是的,这完全合法。问题是在申请的背景下是否有意义。
如果是这样,怎么样?这是做这样的事情的正确方法吗?
你做的方式很好,虽然通常它会被声明为属性而不是方法。
或者我应该创建另一个帮助类,通过创建单独的狗对象来简单地构建狗列表?
这取决于你想做什么......很难确切地说出你的目标是什么。
答案 1 :(得分:0)
简短回答:是的,确实如此。
在许多情况下这是有道理的。在{OOP'世界中,Dog
可以与其他狗相关联。
此外,我还建议你做一些其他微小的改进:
public class Dog
{
public string Name { get; set; } // PascalCase is a convention here
public Dog(string name)
{
Name = name;
}
public IList<Dog> listOfDogs () // try to expose interfaces whenever possible
{
// blah blah
}
}
如果你是OOP的新手,特别是界面的东西值得大量阅读。有一些不同的列表实现,OOP可以帮助您隐藏这些所谓的“实现细节”。稍后,您可以使用Dog[]
代替List<Dog>
,而无需更改班级的消费者。两者都实现IList<Dog>
。
这些东西在很多地方都有详细描述。 SO上有书籍,文章或这个问题:What do programmers mean when they say, "Code against an interface, not an object."?
答案 2 :(得分:0)
这样做:
public class Dogs : List<Dog> {
// your additional methods/properties/etc go here
// every object of this list will be of the type "Dog"
// and you cannot add any type other than the type "Dog" to this list
}
希望有所帮助
修改强> 我希望我能正确理解你的问题......
您可能还想将“Dog”类的定义更改为:
public class Dog {
public Dog(string name) {
this.Name = name;
}
public string Name { get; set; }
}
答案 3 :(得分:0)
是的,一个班级引用自己并拥有自己的成员是完全合法的。
然而,这可能不是您想要解决此特定问题的设计。对于狗来说,列出其他狗只是不合逻辑的(在我看来)。