【问题标题】:Can I selectively inherit a class depending upon a boolean field?我可以根据布尔字段有选择地继承一个类吗?
【发布时间】:2022-12-17 09:12:37
【问题描述】:

我正在试验类,想知道是否可以根据其中一个类中的布尔值链接类。我有一个 Person 类,一个字段是私有的“布尔值 HasPet”。因此,如果一个人有宠物,那么我想制作一个宠物对象并将这些类链接在一起。这可能吗。我对课程完全陌生。我是否必须制作一个 ID 字段并像那样链接它们?

 static void Main(string[] args)
    {
        Person Teacher = new Person("Phoebe", 32, "brown", "hazel", true);
    }
       

      public class Person
   {
    private string Name;
    private int Age;
    private string HairColour;
    private string EyeColour;
    private bool HasPet;

    public Person(string name, int age, string hairColour, string eyeColour, bool hasPet)
    {
        Name = name;
        Age = age;
        HairColour = hairColour;
        EyeColour = eyeColour;
        HasPet = hasPet;
    }
     public void ChangePetStatus()
    {
        Console.Write($"We heard that your pet status has changed...");

        if (HasPet == true)
        {
            Console.WriteLine("we are sorry to hear that. Pet status has been changed.");
            HasPet = false;
        }
        else
        {
            Console.WriteLine("that's great. A pet is a lovely addition to the household. Pet status has been changed.");
            HasPet = true;
        }
    }


    public void Greetings()
    {
        Console.WriteLine($"Hello my name is {Name} and I am {Age} years old. I have {HairColour} hair and {EyeColour} eyes. It is {HasPet} that I have a pet.");
    }
}

【问题讨论】:

  • 不确定“链接在一起”的确切含义。我认为将 List<Pet> 对象作为 Person class 中的字段是有意义的。我想当有人打电话给ChangePetStatus时,你可以创建一个新的Petobject并将其存储在List<Pet>字段中。
  • 您可能想为您的 Person 类提供另一个 Pet 类型的属性/字段,以防万一创建一个 Pet 对象并将其附加到该属性/字段。或者在你的措辞中用不同的措辞。您已经有像名称这样的字段。所以你已经将一个字符串“链接”到 Person 类。对 Pet 类做同样的事情。
  • 喔好吧。我喜欢一个人可以有一个宠物列表,而不是我最初的 1。如果我在 Person 类中有一个新字段“Pet”,它是一个列表,我如何创建一个宠物对象并将其放入列表中?
  • 只需创建它的一个实例:var newPet = new Pet("Fluffy, the dog");,然后添加它:list.Add(newPet)

标签: c# class


【解决方案1】:

如果我们查看微软的定义,我的建议是重新评估继承的含义

继承是面向对象的基本属性之一 编程。它允许你定义一个重用的子类 (继承)、扩展或修改父类的行为.这 其成员被继承的类称为基类。班上 继承基类成员的称为派生类 班级。

在你的情况下,我会说继承与 Person 和引用的 Pet 类无关,因为如果你或任务坚持在这种情况下使用继承,那么它们都不会继承或重用彼此的成员您将需要一些其他类,将 PersonPet 按类似属性分组,例如 LivingBeing 可能具有函数 Respire()Move() 等。

我会说建立多对多关系(或一对多,如果它是特定情况并且Pet不能有超过一个Person作为所有者),其中Person可以有很多Pets和Pet 可以有很多 Person 作为所有者。

我建议的课程是:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public string HairColour { get; set; }
    public string EyeColour { get; set; }
    public IEnumerable<PersonPet> PersonPets { get; set; }
}

public class PersonPet
{
    public int PersonId { get; set; }
    public int PetId { get; set; }
}

public class Pet
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public IEnumerable<PersonPet> PetPersons { get; set; }
}

您不需要任何继承或HasPet字段,因为您可以通过PersonPets确定Person是否具有Pet

【讨论】:

  • 顺便说一句,可以根据您的项目需要更改对属性/字段的访问修饰符
猜你喜欢
  • 2017-03-15
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-18
  • 2013-12-11
  • 1970-01-01
  • 2011-03-09
相关资源
最近更新 更多