问题 您对构造函数的看法

邦德拉

众所周知的成员
加入
10月24日,2020年
消息
77
编程经验
Beginner
如果你看下面的代码。小狗建设者你会说什么是错的?课程狗和继承的小狗之间有明显吗?

Puppy class:
class Puppy : Dog
    {
        // Properties
        public int AgeInMonths { get; set; }
        override public int Age { get; set; } = 0;
      
        // Constructors
        public Puppy(string _name, int _ageInMonths, string _favFood, string _breed, bool _isHungry, List<Toy> _toyList) : base(_name, _ageInMonths, _favFood, _breed, _isHungry, _toyList)
        {
            Name = _name;
            AgeInMonths = _ageInMonths;
            FavFood = _favFood;
            Breed = _breed;
            IsHungry = _isHungry;
            Toys = _toyList;
        }

        public Puppy()
        {
            Name = "Puppy";
            AgeInMonths = 7;
            FavFood = "Whiskas";
            Breed = "Skogskatt";
            IsHungry = false;
            Toys =
            new List<Toy> {
                new Cattree {Size = "Large"},
                new Ball {Color = "Yellow"},
            };

        }
    }
}

C#:
    class Dog : Animal
    {
     
        // Constructors
        public Dog () {
            Name = "Doggy";
            Age = 4;
            FavFood = "Frolic";
            Breed = "Rotweiler";
            IsHungry = false;
            new List<Toy> {
                new Cattree {Size = "Large"},
                new Ball {Color = "Yellow"},
            };
        }
     
        public Dog(string _name, int _age, string _favFood, string _breed, bool _isHungry, List<Toy> _toyList)
            : base(_name, _age, _favFood, _breed, _isHungry, _toyList)
        {
            Name = _name;
            Age = _age;
            FavFood = _favFood;
            Breed = _breed;
            IsHungry = _isHungry;
            Toys = _toyList;
        }
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,893
地点
切萨皮克,va.
编程经验
10+
If the base class Dog already sets Name, FavFood, Breed, IsHungry, and Toys, then there is no need for your Puppy class to set them.

Now as for passing in _ageInMonths to Dog's constructor's age parameter, shouldn't you be dividing the value by 12 since presumably that parameter is supposed to be age in years?

这是一个编程风格的东西,但C#中的前导下划线通常用于类成员变量,而不是参数,按照不遵循的人"不要使用匈牙利的符号"关于C#命名约定的建议。我忘记了哪些编程语言,其中有一个公约,其中参数装饰有领先的下划线的参数。

Not related to your constructor, I think that your Age property override needs to be smarter to be able to do conversions between AgeInMonths and the expected behavior where Age is age in years.
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
删除小狗类。没有用。如果您有一个狗课,那么为该类添加一个属性来定义狗的年龄或青少年。小狗和狗一样。小狗还是一只狗。

这就像有一班孩子,并拥有一类宝宝来提到孩子。
 

邦德拉

众所周知的成员
加入
10月24日,2020年
消息
77
编程经验
Beginner
谢谢你的快速答案!

现在作为通过_ageinmonths到狗的构造函数的年龄参数,你不应该将值划分为12,因为大概该参数应该是年龄的年龄吗?
这可能是一个好主意!但是,如果我现在保持这种情况,应该在小狗课中删除以下情况吗?我怎么将年龄设置为0,当时是一只小狗?
C#:
override public int Age { get; set; } = 0;

如果基类狗已经设置了名称,favfood,品种,ishungry和玩具,那么您的小狗课程不需要设置它们。
删除继承的字段让我有一些错误。如果这里不需要基地领域,我不认为我明白它应该看起来像是如此?
capture.png.

C#:
        public Puppy(int _ageInMonths)
        {
            Name = _name;
            AgeInMonths = _ageInMonths;
            FavFood = _favFood;
            Breed = _breed;
            IsHungry = _isHungry;
            Toys = _toyList;
        }



这是一个编程风格的东西,但C#中的前导下划线通常用于类成员变量
应该是 instead?
 

邦德拉

众所周知的成员
加入
10月24日,2020年
消息
77
编程经验
Beginner
删除小狗类。没有用。如果您有一个狗课,那么为该类添加一个属性来定义狗的年龄或青少年。小狗和狗一样。小狗还是一只狗。

这就像有一班孩子,并拥有一类宝宝来提到孩子。
我完全同意这一点。这是一名学校分配,所以目的是展示一个继承的课程。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
大多数学校不知道如何教人们对编码或编程。他们给学生的例子和作业是恶魔般的。几乎所有来自学校作业的人都是由自己嘲笑的。这就是为什么我不愿意在这个问题上说更多。他们做得更好地给了你一类车,然后让你作为你的基类继承了车辆。拥有班级类型的汽车会更有意义,因为所有汽车都是车辆,所有车辆都有名字。因此,一辆汽车可以继承车载以获取车辆的品牌名称的名称属性等。

除了他们给你的例子之外,你会做同样的事情,他们给你相当蹩脚和一个不好的例子。但是 @jmcilkinney. 总是对我说,虽然他尚未对我不同意,但他提醒我,往往是学生被评分的练习的原则。根据他们的教师请求,仍应遵循分配的指示。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
这是我参考的示例类型的一个很好的例子,这将是一个更好的用途: c#继承

小狗课。

创造一类动物,
然后宣布一类类型的动物来继承你的动物类,如猫,狗,小马等。链接应该引发你的想象力。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,893
地点
切萨皮克,va.
编程经验
10+
谢谢你的快速答案!


这可能是一个好主意!但是,如果我现在保持这种情况,应该在小狗课中删除以下情况吗?我怎么将年龄设置为0,当时是一只小狗?
C#:
override public int Age { get; set; } = 0;


删除继承的字段让我有一些错误。如果这里不需要基地领域,我不认为我明白它应该看起来像是如此?
查看附件1348.
C#:
        public Puppy(int _ageInMonths)
        {
            Name = _name;
            AgeInMonths = _ageInMonths;
            FavFood = _favFood;
            Breed = _breed;
            IsHungry = _isHungry;
            Toys = _toyList;
        }




应该是 instead?

像这样:
C#:
class Puppy : Dog
{
    public int AgeInMonths { get; set; }

    public override int Age
    {
        get => AgeInMonths / 12;
        set => AgeInMonths = value * 12;
    };

    public Puppy(string name, int ageInMonths, string favFood, string breed, bool isHungry, List<Toy> toyList)
        : base(name, ageInMonths / 12, favFood, breed, isHungry, toyList)
    {
         AgeInMonths = _ageInMonths;
    }

    public Puppy()
        : base("Puppy", 0, "Whiskas", "Skogskatt", isHungry : false, null)
    {
        AgeInMonths = 7;
        Toys = new List<Toy>
               {
                   new Cattree {Size = "Large"},
                   new Ball {Color = "Yellow"},
               };
    }
}
 
最佳 底部