【问题标题】:C# how does the :base class work when defining the subclass?C#定义子类时:base类是如何工作的?
【发布时间】:2017-04-06 04:36:14
【问题描述】:

所以我只是想在这里理解这个概念:

场景 1

我有一个名为 Person 的基类,它有一个没有参数的构造函数(即默认构造函数)

这个类有 2 个我可以更改的受保护属性(它们是公共的)

现在我想创建一个有一个额外参数的子类(称为学生),所以我可以创建一个带有 3 个参数的构造函数(来自基类的 1 + 2)

如果我创建一个子类的对象,我可以传入 3 个参数 - 这没问题(这可能是错误的方法,但它有效)

场景 2

我有一个名为 Person 的基类,现在我有一个带有 2 个参数的构造函数,我没有没有参数的默认构造函数。

当我现在创建为其构造函数创建另一个参数的子类(学生)时。

这个构造函数只有一个参数,我不能像在场景 1 中那样从基类中添加第二个和第三个参数

但是我可以使用:base() 链接基类,但我需要传入值而不是参数。

问题

当我创建一个学生对象时,如何在:base 类中输入自定义值。因为当我在子类构造函数中链接它时,我正在传递值。

基类

class Person
{
    protected string Name;
    protected int Age;

    //public Person1(){}

    public Person(string _name, int _age)
    {
        Name = _name;
        Age = _age;
    }

    public void SayHello()
    {
        Console.WriteLine("Helllo World!");
        Console.WriteLine($"My name is {Name} and I am {Age} years old");
    }
}

子类

class Student : Person1
{
    private int StudentId;

    //I was hoping to put in new parameters in the base ()
    public Student(int _studentId) : base ("", 00)
    {
        //_name and _age do not exist
        //Name = _name;
        //Age = _age;
        StudentId = _studentId;
    }
}

Program.cs

    static void Main(string[] args)
    {
        var p1 = new Person1("John", 45);
        p1.SayHello();


        var student1 = new Student(123456);
    }

但我不知道如何添加在我的基类中设置的参数

【问题讨论】:

  • 在编写新的构造函数时,编译器默认不生成默认的无参构造函数。因此除了其他构造函数之外,您还必须编写无参数构造函数才能调用base()
  • 那么在创建子类的对象时如何自定义这些参数呢?换句话说,使用该示例,如果学生类中没有参数,我如何给 student1 取一个与 student2 不同的名称?
  • 肮脏的方式是使用静态字段为您每次实例化计数。干净的方法是使用工厂模式,创建一个工厂来处理学生的初始化
  • 能否提供一个代码示例作为答案?
  • @M.kazemAkhgary 我认为你真的误解了 OP 正在寻找什么。

标签: c# parameters subclass


【解决方案1】:

Student 构造函数需要采用将传递给Person 基本构造函数的参数。

class Student : Person
{
    private int StudentId;

    public Student(string name, int age, int studentId)
        : base(name, age)
    {
        StudentId = studentId;
    }
}

【讨论】:

  • 那么这里的学生姓名和年龄参数映射到基础姓名和年龄了吗?
  • 将基本构造函数视为您从子构造函数调用的方法。根据Person 构造函数签名,Student 构造函数调用 Person 构造函数并传入两个参数。第一个参数是一个字符串(在基本构造函数中引用为_name),第二个参数是一个整数(在基本构造函数中引用为_age
  • 太棒了,现在更有意义了 :-) 感谢您为我澄清这一点。
猜你喜欢
  • 2013-12-01
  • 2019-05-25
  • 2022-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 2016-02-13
  • 2014-02-25
相关资源
最近更新 更多