在 C# 中的 subclass 构造函数中初始化基 class 的字段

Initialize base class’s fields in subclass constructor in C#

我有一个包含三个字段的基础 class,但我没有像这样以正常方式初始化它的字段:

class ParentClass
{
    public string Name { get; set; }
    public string Family { get; set; }
    public string Address { get; set; }

    public ParentClass(string Name, string Family, string Address)
    {
        this.Name = Name;
        this.Family = Family;
        this.Address = Address;

    }

}

class ChildClass : ParentClass
{
    public int StudentID { get; set; }
    public int StudentScore { get; set; }

    public ChildClass(string Name, string Family, string Address, int StudentID, int StudentScore)
        : base(Name, Family, Address)
    {

        this.StudentID = StudentID;
        this.StudentScore = StudentScore;

    }

    static void Main(string[] args)
    {
        var Pro = new ChildClass("John", "Greene", "45 Street", 76, 25);
        Console.WriteLine(Pro.Name + Pro.Family + Pro.Address + Pro.StudentID + Pro.StudentScore);
    }
}

我已经在 ChildClass 构造函数中初始化了字段,而没有像这样显式调用基础 class 构造函数:

class ParentClass
{
    public string Name { get; set; }
    public string Family { get; set; }
    public string Address { get; set; }
}

class ChildClass : ParentClass
{
    public int StudentID { get; set; }
    public int StudentScore { get; set; }

    public ChildClass(int StudentID, int StudentScore)
    {
        Name = "John";
        Family = "Greene";
        Address = "45 Street";
        this.StudentID = StudentID;
        this.StudentScore = StudentScore;

    }
    static void Main(string[] args)
    {
        var Pro = new ChildClass(76, 25);
        Console.WriteLine(Pro.Name + Pro.Family + Pro.Address + Pro.StudentID + Pro.StudentScore);
    }
}

我知道我可以在父 class 本身中初始化父 class 的字段,这是一个伪造的例子,但我想知道这是否是一个好的做法在现实生活和更复杂的情况下有类似的事情,我有什么理由不应该做这样的事情吗?至于不显式调用基础 class 构造函数?

编辑: 我更关心的是没有显式调用基础 class 构造函数并在 subclass 部分初始化它,所以我已经编辑了提到要公开的字段的最后一部分。

如您所见,字段已经 "exposed"。在第一个示例中,您仍然可以从派生的 class 中获取这些变量。

至于不使用基础 class 构造函数是一种好习惯,我会说不是。通过仅具有参数化基础 class 构造函数,您可以确保该 class 的未来实现者初始化基础 class 属性。例如,在你的第二个我可以写:

public ChildClass(int StudentID, int StudentScore)
{
    this.StudentID = StudentID;
    this.StudentScore = StudentScore;
}

没有错误。除此之外,您的样本之间几乎没有差异。