在类定义中使用类的同一对象

本文关键字:对象 定义 | 更新日期: 2023-09-27 18:26:50

我有一个c#问题,我很难回答。我正在设计一个类,但我对oop不太熟悉。是否可以定义一个与类本身的类型相同类型的列表?例如说我有一个狗类:

public class Dog
{
    public string _name {get; set;};
    public Dog (string, name)
    {
        _name = name;
    }
    public List<Dog> listOfDogs ()
    {
        // blah blah
    }
}

这样的结构可能吗?如果是,怎么做?这样做正确吗?或者我应该创建另一个助手类,通过创建单独的dog对象来简单地构建dog列表?

感谢

在类定义中使用类的同一对象

简短回答:是的。

这在很多情况下都是有道理的。Dog可能与OOP世界中的其他狗相关联。

此外,让我只建议你其他一些小的改进:

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上有书、文章或这个问题:程序员说";针对接口而非对象的代码"?

是否可以定义一个与类本身的类型相同类型的列表
这样的结构可能吗?

是的,这是完全合法的。问题是它在应用程序的上下文中是否有意义。

如果是,怎么做?这样做正确吗?

虽然通常会将其声明为属性而不是方法,但执行此操作的方式很好。

或者我应该创建另一个助手类,通过创建单独的dog对象来简单地构建dog列表?

这取决于你想做什么…很难说你的目标到底是什么。

这样做:

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; }
}

是的,类引用自身并将自身实例作为成员是完全合法的。

尽管如此,这可能不是你想要的针对这个特定问题的设计。(在我看来)一只狗列出其他狗的名单是不合乎逻辑的。