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

OOP中派生类构造传参限制及土地与火车站类关系问题

Terrain与RailStation的类关系及构造函数传递问题解答

一、技术疑问解答

1. 如何阻止派生类的构造函数向基类传递变量?

要实现该需求,核心是让派生类无法调用基类的带参构造函数,具体可通过以下方式:

  • 给基类添加无参构造函数,并将带参构造函数的访问修饰符设为protected或private。若基类仅提供无参构造函数,派生类构造函数会默认调用它,无需显式传递参数;
  • 若基类无需被实例化,可将其设为抽象类并仅提供无参构造函数,进一步限制派生类的传参行为。

2. Terrain类与RailStation类的正确类关系是什么?

二者属于聚合关系(关联关系的子类):

  • Terrain(土地)是“整体”,RailStation(火车站)是“部分”;
  • 火车站依赖土地存在,但即使土地被销毁,火车站理论上可独立存在(如搬迁),符合聚合“部分可独立于整体”的特性;
  • 一个土地可容纳多个火车站,完全匹配业务逻辑。最初使用的继承关系错误,因为继承代表“is-a”(是一种)的关系,火车站显然不是一种土地。

二、场景问题与优化方案

原实现问题

用户最初错误使用继承实现,导致无法分别设置土地和火车站的名称,代码如下:

Terrain类

namespace Classes;

public class Terrain
{
    private string terrainName;
    
    public Terrain(string name)
    {
        this.terrainName = name;
    }

    public string TerrainName
    {
        get { return terrainName; }    
    }
}

RailStation类

namespace Classes;

public class RailStation : Terrain
{
    private string railStationName;

    public RailStation(string name): base(name)
    {
        railStationName = name;
    }

    public string RailStationName
    {
        get { return railStationName; }
    }
}

实例化与输出代码

var station = new RailStation("newWorld");
Console.WriteLine($"Nuova Rail Station: '{station.RailStationName} station' and new Terrain '{station.TerrainName}'");

问题:继承关系下,RailStation构造函数必须调用基类的带参构造函数,导致只能传入同一个名称,无法分别设置土地和火车站的标识。

优化方案:采用聚合关系重构

重构后的代码将Terrain作为容器,关联多个RailStation实例,实现了独立设置名称的需求:

重构后的类代码

public class RailStation
{
    private string railStationName;

    public RailStation(string name)
    {
        railStationName = name;
    }

    public string RailStationName
    {
        get { return railStationName; }
    }
}

public class Terrain
{
    private string terrainName;
    public List<RailStation> RailStations { get; set; }

    public Terrain(string name)
    {
        this.terrainName = name;
    }

    public string TerrainName
    {
        get { return terrainName; }    
    }
}

使用示例

var terrain = new Terrain("NewLand");
terrain.RailStations = new List<RailStation>();

var station01 = new RailStation("Station01");
var station02 = new RailStation("Station02");
var station03 = new RailStation("Station03");
terrain.RailStations.Add(station01);
terrain.RailStations.Add(station02);
terrain.RailStations.Add(station03);

Console.WriteLine($"Nuova stazione: '{station01.RailStationName} station' su nuovo terreno '{terrain.TerrainName}'");
Console.WriteLine($"Nuova stazione: '{station02.RailStationName} station' su nuovo terreno '{terrain.TerrainName}'");
Console.WriteLine($"Nuova stazione: '{station03.RailStationName} station' su nuovo terreno '{terrain.TerrainName}'");

该方案不仅解决了名称无法独立设置的问题,还更符合“土地上建有多个火车站”的业务逻辑。

内容的提问来源于stack exchange,提问作者Giovanni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:22:07