You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中实现结构体的「继承」效果?

如何在C#中实现结构体的「继承」效果?

刚巧碰到过类似的需求!C#里结构体确实不支持继承——官方这么设计主要是为了保持结构体的轻量特性。不过咱们可以用组合替代继承的方式模拟出类似的效果,我来分享下我的实现思路,用实际场景拆解清楚。

先看个简单场景:我有个Person结构体(明明可以用类,但就是想试试结构体的情况😝),现在要做一个Student结构体,它本质上是Person,但多了一个University的专属属性。而且我不想把Person里的属性和方法都复制粘贴一遍,毕竟这样太冗余了,可C#又不让结构体继承,咋办?

我的实现方案

核心思路是把基础结构体(Person)作为成员变量嵌入到目标结构体(Student)中,通过封装属性和方法来复用原有逻辑,同时扩展专属内容。

第一步:定义基础的Person结构体

先把Person的属性和方法定义好,这是我们要复用的基础逻辑:

private struct Person
{
    public string Name { get; set; }
    public string LastName { get; set; }
    public string EyeColor { get; set; }
    public string HairColor { get; set; }

    public void Walk()
    {
        Console.WriteLine($"{Name} {LastName} is walking.");
    }
}

第二步:实现Student结构体(模拟继承效果)

在Student里嵌入一个Person实例,然后把Person的属性通过封装暴露出去,方法可以选择复用或者扩展逻辑:

private struct Student
{
    // 组合Person实例,复用它的所有能力
    private Person _person;
    // Student的专属属性
    public string University { get; set; }

    // 封装Person的属性,让外部可以直接访问(模拟继承的属性访问体验)
    public string Name
    {
        get => _person.Name;
        set => _person.Name = value;
    }

    public string LastName
    {
        get => _person.LastName;
        set => _person.LastName = value;
    }

    public string EyeColor
    {
        get => _person.EyeColor;
        set => _person.EyeColor = value;
    }

    public string HairColor
    {
        get => _person.HairColor;
        set => _person.HairColor = value;
    }

    // 扩展Walk方法:先复用Person的逻辑,再添加Student专属行为
    public void Walk()
    {
        _person.Walk();
        Console.WriteLine($"They're heading to {University} after walking.");
    }
}

注意事项

  • 这不是真正的继承:因为结构体是值类型,这种组合方式没法实现多态(比如不能把Student赋值给Person类型的变量),如果需要多态特性,还是得用类。
  • 留意值类型特性:结构体是值拷贝,所以在传递Student实例的时候,内部的Person也会被拷贝,要注意这种特性带来的行为差异。

备注:内容来源于stack exchange,提问作者123iamking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 14:04:08