咨询:创建带默认值与无默认值的属性类的写法是否正确?
你的实现分析与优化建议
你的实现思路是可行的,核心逻辑符合面向对象的抽象设计原则:通过抽象类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
相关产品推荐
相关产品推荐

