0Pricing
C# Academy · 课时

与属性和基类结合

将参数传递给基类型和属性。

与属性和基类结合 是 CoddyKit 上的免费 C# Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。

将主构造函数与继承结合

带有主构造函数的派生类可以在声明头中使用 : Base(args) 语法,将其参数传递给基类。

using System;

class Animal(string name) {
    public string Name => name;
}

class Dog(string name) : Animal(name) {
    public string Speak() => Name + " says Woof";
}

Console.WriteLine(new Dog("Rex").Speak()); // Rex says Woof

转发部分参数

派生类可以接收比基类更多的参数,并且只将相关参数向上传递。

using System;

class Shape(string color) {
    public string Color => color;
}

class Box(string color, int size) : Shape(color) {
    public int Size => size;
}

var b = new Box("red", 5);
Console.WriteLine(b.Color + " " + b.Size); // red 5

转换传递给基类的参数

您可以在声明头中直接根据派生类参数计算传递给基类构造函数的参数。

using System;

class Label(string text) {
    public string Text => text;
}

class UpperLabel(string text) : Label(text.ToUpper()) {
}

Console.WriteLine(new UpperLabel("hi").Text); // HI

同时添加属性

主构造函数可以与显式属性共存。请在声明时根据参数初始化属性。

using System;

class Product(string name, decimal price) {
    public string Name { get; } = name;
    public decimal Price { get; set; } = price;
}

var p = new Product("Book", 12m);
p.Price = 10m;
Console.WriteLine(p.Name + " " + p.Price); // Book 10

基类参数与派生类中的使用

即使参数已被转发给基类,派生类的主构造函数参数仍然可以在派生类主体中使用。

using System;

class Base(int id) {
    public int Id => id;
}

class Item(int id, string label) : Base(id) {
    public string Describe() => "#" + id + ": " + label;
}

Console.WriteLine(new Item(7, "Widget").Describe()); // #7: Widget

记录类型与主构造函数

记录类型使用主构造函数自动生成公共的仅初始化属性。位置记录是最简洁的形式。

using System;

record Person(string First, string Last) {
    public string Full => First + " " + Last;
}

Console.WriteLine(new Person("Ada", "Lovelace").Full); // Ada Lovelace

记录类型继承

派生记录类型会按位置将参数转发给基记录类型,并生成合并后的属性集合。

using System;

record Vehicle(string Make);
record Car(string Make, int Doors) : Vehicle(Make);

var c = new Car("Toyota", 4);
Console.WriteLine(c.Make + " " + c.Doors); // Toyota 4

调用基类之前进行验证

如果需要验证,请在属性初始化器中使用抛出表达式完成;基类调用仍会先执行。

using System;

class Base(string tag) { public string Tag => tag; }

class Node(string tag) : Base(tag) {
    public string Tag2 { get; } =
        tag.Length > 0 ? tag : throw new ArgumentException("empty");
}

Console.WriteLine(new Node("a").Tag); // a

混合使用捕获参数和属性

您可以将部分参数保留为捕获的私有状态,同时将其他参数公开为属性,从而根据需要设计公共接口。

using System;

class Order(int id, decimal total) {
    public decimal Total { get; } = total; // public
    public string Reference() => "ORD-" + id;   // id stays private
}

var o = new Order(42, 99m);
Console.WriteLine(o.Reference() + " " + o.Total); // ORD-42 99

属性默认值

与参数无关的属性仍然可以使用默认初始化器,并且可以自由地与主构造函数参数结合。

using System;

class Session(string user) {
    public string User { get; } = user;
    public bool Active { get; set; } = true;
}

var s = new Session("kai");
Console.WriteLine(s.User + " " + s.Active); // kai True

综合运用

一个向基类转发参数、添加属性并公开计算成员的派生类。

using System;

class Employee(string name) {
    public string Name => name;
}

class Manager(string name, int teamSize) : Employee(name) {
    public int TeamSize { get; } = teamSize;
    public string Title => Name + " (manages " + TeamSize + ")";
}

Console.WriteLine(new Manager("Sam", 5).Title); // Sam (manages 5)

快速检查

请确认主构造函数如何向基类转发参数。

回顾

您已经了解了如何将主构造函数与属性和基类结合使用。

  • class D(...) : Base(args) 会将参数转发给基类。
  • 传递给基类的参数可以直接计算。
  • 可以在声明时根据参数初始化属性。
  • 记录类型会根据位置参数生成公共的仅初始化属性。

常见问题解答

「与属性和基类结合」课时是免费的吗?

是的 — 「与属性和基类结合」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。

「与属性和基类结合」这节课中我会学到什么?

将参数传递给基类型和属性。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「与属性和基类结合」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 类中的主构造函数
  2. 在成员中捕获参数
  3. 结构中的主构造函数
  4. 与属性和基类结合
← 返回 C# Academy