您对构造函数的意见

邦德拉

知名会员
已加入
2020年10月24日
留言内容
69
编程经验
Beginner
如果您看下面的代码。您会说Puppy构造函数有什么问题?在类Dog和继承的Puppy之间是否有明显的区别?

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, 清单<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 清单<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 清单<Toy> {
                new Cattree {Size = "Large"},
                new Ball {Color = "Yellow"},
            };
        }
     
        public Dog(string _name, int _age, string _favFood, string _breed, bool _isHungry, 清单<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,500
地点
弗吉尼亚州切萨皮克
编程经验
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#中的前划线通常用于类成员变量,而不是参数。"不要使用匈牙利表示法"有关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.
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
删除小狗课程。这是毫无意义。如果您有狗类,则向该类添加属性以定义狗的年龄或年龄。小狗和狗一样。小狗仍然是狗。

这就像有一个孩子班级和一个婴儿班级来指代孩子一样。
 

邦德拉

知名会员
已加入
2020年10月24日
留言内容
69
编程经验
Beginner
感谢您的快速回答!

现在,将_ageInMonths传递给Dog的构造函数的age参数,您是否不应该将值除以12,因为假定该参数应该以年为单位?
那可能是个好主意!但是,如果我暂时保留此内容,是否应该在小狗课程中删除以下内容?如果是小狗,我还要如何将年龄设置为0?
C#:
override public int Age { get; set; } = 0;

如果基类Dog已经设置了Name,FavFood,Breed,IsHungry和Toys,则您的Puppy类无需设置它们。
删除继承字段会给我带来一些错误。我不认为如果不需要此处的基本字段,那么这里应该是什么样?
捕获.png

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



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

邦德拉

知名会员
已加入
2020年10月24日
留言内容
69
编程经验
Beginner
删除小狗课程。这是毫无意义。如果您有狗类,则向该类添加属性以定义狗的年龄或年龄。小狗和狗一样。小狗仍然是狗。

这就像有一个孩子班级和一个婴儿班级来指代孩子一样。
我完全同意这一点。这是学校的任务,因此目的更多是为了展示正在继承的课程。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
大多数学校都不知道如何教人们编码或编程。他们给学生的榜样和任务是令人反感的。几乎所有来学校做作业的人都被我自己嘲笑。这就是为什么我不愿多说这个话题。他们会做得更好,给您一类Vehicle,然后让您继承Vehicle作为您的基类。由于所有汽车都是车辆并且所有车辆都有名称,因此拥有一类汽车会更有意义。因此,汽车可以继承车辆类别,以获取该汽车品牌等的名称属性。

在上面,您将执行相同的操作,只是他们给您的示例相当la脚,并且是一个不好的示例。但是作为 @jmcilhinney 总是对我说,尽管他还没有不同意我的想法,但他提醒我,这通常是学生评分的练习原则。并且,作业指导仍应按照其指导老师的要求进行。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
这也是我所引用的示例类型的一个很好的示例,这将是一个更好的示例: C#继承

抛弃小狗班。

创造一类动物,
然后声明要从您的动物类别继承的一类动物,例如猫,狗,小马等。该链接应该激发您的想象力。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
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;
        }




应该是 这个 代替?

像这样:
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, 清单<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 清单<Toy>
               {
                   new Cattree {Size = "Large"},
                   new Ball {Color = "Yellow"},
               };
    }
}
 
最佳 底部