内部类构造函数..这行得通吗?

本文关键字:行得通 构造函数 内部类 | 更新日期: 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基础开始并保持简单。