MST

星途 面试题库

面试题:C#记录类型(Record)不可变对象设计中的深层次特性

在C#中,当使用记录类型(Record)设计不可变对象时,考虑继承场景,子类如何在保持不可变性的同时扩展父类的功能?请详细阐述原理并给出代码示例。
11.8万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

原理

  1. 记录类型(Record)的不可变性:在C#中,记录类型默认创建不可变对象,其属性通常为init-only,意味着只能在对象初始化时赋值。
  2. 继承场景:子类继承父类记录类型时,要保持不可变性,需要遵循父类的不可变规则。这意味着子类不能改变父类已有的不可变属性的赋值方式,同时要确保自身新增的属性也遵循不可变原则。
  3. 扩展功能:子类可以通过新增init-only属性、重写虚方法或实现新的方法来扩展功能。

代码示例

// 父类记录类型
public record ParentRecord
{
    public string Name { get; init; }
    public ParentRecord(string name)
    {
        Name = name;
    }
    public virtual string GetInfo()
    {
        return $"Name: {Name}";
    }
}

// 子类记录类型扩展功能
public record ChildRecord : ParentRecord
{
    public int Age { get; init; }
    public ChildRecord(string name, int age) : base(name)
    {
        Age = age;
    }
    public override string GetInfo()
    {
        return $"{base.GetInfo()}, Age: {Age}";
    }
}

使用示例:

class Program
{
    static void Main()
    {
        ChildRecord child = new ChildRecord("John", 30);
        Console.WriteLine(child.GetInfo());
    }
}

在上述代码中,ParentRecord 是父类记录类型,具有不可变的 Name 属性。ChildRecord 继承自 ParentRecord,新增了不可变的 Age 属性,并通过重写 GetInfo 方法扩展了功能。在使用时,创建的 ChildRecord 对象保持了不可变性。