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

咨询:创建带默认值与无默认值的属性类的写法是否正确?

你的实现分析与优化建议

你的实现思路是可行的,核心逻辑符合面向对象的抽象设计原则:通过抽象类GameLevel定义统一的属性契约,子类GameLevelWithDefaultValue继承并提供带默认值的具体实现,能保证两种场景下的对象遵循相同的属性接口,方便后续代码统一处理。

但这里有一个关键问题需要修正:
GameLevel是抽象类,无法直接实例化,所以你说的“需要无默认值的属性则调用GameLevel类”无法实现。如果需要无默认值的版本,得再创建一个不带默认值的具体子类,比如:

public class GameLevelWithoutDefault : GameLevel
{
    public override int nextLevelToUnlock { get; set; }
    public override List<LevelDetails> levelDetails { get; set; }
}

实例化这个类时,属性会被初始化为C#默认值:nextLevelToUnlock为0,levelDetails为null,符合你“无默认值”的需求。

另外给你几个优化建议:

  • 遵循C#命名规范:属性和类成员应该使用PascalCase命名,比如把nextLevelToUnlock改成NextLevelToUnlock,levelIndex改成LevelIndex,提升代码可读性和规范性。
  • 增强封装性:如果levelDetails不需要被外部直接替换整个列表,可以把set访问器设为protected,或者改用只读集合(比如IReadOnlyList<LevelDetails>),同时提供修改列表元素的方法,避免外部意外替换集合导致逻辑错误。
  • 确认默认集合的独立性:当前GameLevelWithDefaultValue的levelDetails默认值是每次实例化都创建新列表,这个写法是正确的,避免了多个实例共享同一个列表的问题。

调整后的完整代码示例(修正命名+添加无默认值子类):

public abstract class GameLevel
{
    public abstract int NextLevelToUnlock { get; set; }
    public abstract List<LevelDetails> LevelDetails { get; set; }
}

public class GameLevelWithDefaultValue : GameLevel
{
    public override int NextLevelToUnlock { get; set; } = 1;

    public override List<LevelDetails> LevelDetails { get; set; } = new List<LevelDetails>()
    {
        new LevelDetails{ LevelIndex = 1, Stars = 0 },
        new LevelDetails{ LevelIndex = 2, Stars = 0 },
        new LevelDetails{ LevelIndex = 3, Stars = 0 }
    };
}

public class GameLevelWithoutDefault : GameLevel
{
    public override int NextLevelToUnlock { get; set; }
    public override List<LevelDetails> LevelDetails { get; set; }
}

public class LevelDetails
{
    public int LevelIndex { get; set; }
    public int Stars { get; set; }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:15:23