内部类构造函数..这行得通吗?
本文关键字:行得通 构造函数 内部类 | 更新日期: 2023-09-27 17:56:38
好的,对不起,伙计们,我知道你们会告诉我我需要搜索和搜索,但我已经有了,而且我很确定我假设这将按照我想要的方式工作是正确的,但我想我会在这里问并尝试在我的学习经验中获得一些专业帮助,因为 Unity 答案不是那么好。
无论如何,我正在尝试开始构建另一个MMORPG,同时我也在学习c尖锐。我有一个职业类(玩家的职业,如法师、骑士等),我想在创建玩家职业的同时创建它,所以我需要使用 id 来决定哪个职业以及他们继承的属性值。
这就是我所拥有的,它会像我试图的那样工作吗?还是我做了什么可怕的错误...?
编辑
using UnityEngine;
using System.Collections;
//DONE: abstract: a personage can't be "Vocation", but Mage, Warrior, Archer...
public abstract class Vocation
{
//DONE: just a readonly property
public int Vid {get; }
//DONE: just a readonly property
public string Name { get { return _Name; } }
protected string _Name = "None";
//DONE: let's ensure the property to be overriden
public abstract HitPointsPerLevel { get; }
public abstract ManaPointsPerLevel { get; }
//DONE: you don't want this constructor to be public, but protected only
//DONE: Assign all the data in one place
protected Vocation(int vid)
{
Vid = vid;
}
}
//DONE: do not declare derived class as inner one
internal class Mage : Vocation
{
sealed public override float HitPointsPerLevel { get { return 12f; } }
sealed public override string _Name = "Mage";
//DONE: typo constructor should have been "Mage"
public Mage() : base(1)
{
}
}
伙计们,现在看起来怎么样?
我建议重新设计实现
using UnityEngine;
using System.Collections;
//DONE: abstract: a personage can't be "Vocation", but Mage, Warrior, Archer...
public abstract class Vocation
{
//DONE: just a readonly property
public int Vid {get; }
//DONE: just a readonly property
public string Name {get; }
//DONE: let's ensure the property to be overriden
public abstract HitPointsPerLevel { get; }
//DONE: you don't want this constructor to be public, but protected only
//DONE: Assign all the data in one place
protected Vocation(int vid, string name)
{
if (string.IsNullOrEmpty(name))
throw new ArgumentNullException("name");
Vid = vid;
Name = name;
}
}
//DONE: do not declare derived class as inner one
internal class Mage : Vocation
{
sealed public override float HitPointsPerLevel { get { return 12f; } }
//DONE: typo constructor should have been "Mage"
public Mage() : base(1, "Mage")
{
}
}
代码可以工作,除了构造函数名称(Warrior
而不是Mage
)。
我确实想知道为什么Mage
必须是内部嵌套的Vocation
类。那有什么用?
我可以理解你为什么要让它internal
:你不想让外部程序集创建一个实例,你可以通过工厂来做到这一点。但是,没有理由使类嵌套。基类可以独立存在。只需拉出嵌套类,使用基类上的protected
成员,即可在基类和派生类之间进行通信。
一个小旁注:您可以在此处使用this
而不是base
:
public Mage(int vid) : base(vid)
{
this.Vid = 1;
this.Name = "Mage";
}
除了其他答案之外,几乎没有什么要评论的,但它们都在代码审查的上下文中。也许这在 codereview.stackexchange.com 更好。
首先(这取决于风格) - 我尽量避免像Vid
这样的变量 - vocationId
没有错 - 最好有足够的描述性。
问题更相关的是,我不确定你的Mage
/person,从语义上讲,是一种职业——所以它不应该继承它。也许这是一个有职业的人,但它本身不是职业 - 它可能不会扩展职业功能。这是继承的唯一意图。
您是否试图为了实践而硬塞继承的概念?
另外,顺便说一句,在 C# 6 中,您具有表达式体属性,因此您可以稍微压缩代码:
public string Name => "None";
虽然这些对我来说看起来像常数。这基本上需要大的重新设计,从封装的OOP基础开始并保持简单。