C#继承重写一个参数

C# inheritance override a parameter

我有一个 "specific Manager" 继承了 "Manager", 我还有一个 "specific Object" 继承了 "BaseClass"

我尝试编码的是用 "Manager" 处理 "BaseClass" 属性,用 "specific Manager" 处理 "specific Object" 属性。

现在可能有点乱所以我有一个 Class UML :

这是代码的基础:

class Program
{
    static void Main(string[] args)
    {
        SpecificManager ManagerFoo = new SpecificManager();
        SpecificManager2 ManagerBar = new SpecificManager2();
    }
}

public class Manager
{

    public void Manage()
    {
        // deal with BaseClass properties of the SpecificObject
        // myObject should be know as type of SpecificObject or SpecificObject2 depending of SpecificManager child
        myObject.isAlive = true;
    }
}

public class SpecificManager : Manager
{
    public SpecificObject myObjectSpec = new SpecificObject("Alfred");
    public void SpecificManage() 
    {
        // Manage Attributes of SpecificObject class
        myObjectSpec.level = 2;
        base.Manage();
    }
}
public class SpecificManager2 : Manager
{
    public SpecificObject2 myObjectSpec = new SpecificObject2("Alfred2");
    public void SpecificManage2()
    {
        // Manage Attributes of SpecificObject2 class
        myObjectSpec.description = "Foo";
        base.Manage();
    }
}

public class BaseClass
{
    public string gameObject;
    public bool isAlive;

    public BaseClass(string gameObjectStructure)
    {
        this.gameObject = gameObjectStructure;
    }
}

public class SpecificObject : BaseClass
{
    public int level = 1;
    public SpecificObject(string objectname) : base(objectname)
    {

    }
}

public class SpecificObject2 : BaseClass
{
    public string description = String.Empty;
    public SpecificObject2(string objectname) : base(objectname)
    {

    }
}

也许我希望它的工作方式不是正确的方式, 所以我真的很高兴得到一些建议!

谢谢亲爱的帮手!

关于继承如何工作的具体问题的快速回答是,您可以将 public int 级别放入基础 class 对象(@Sriram Sakthivel 指出这不是一个好方法用于您的 class 的名称,因为它是 c# 中最基本的对象),然后两个子 classes 都可以使用它。所以你的代码至少会在那个时候编译和运行。

这看起来像下面这样(请注意,我已经将您的 class 名称从 Object 更改为 BaseClass,虽然比 Object 更好的名称仍然不能很好地描述 class 的作用所以我也不会使用)

public class BaseClass
{
    public string gameObject;
    public bool isAlive;
    public int level;

    public BaseClass(string gameObjectStructure)
    {
        this.gameObject = gameObjectStructure;
        level = 1;
    }
}

另一个建议是,您首先不要养成使用 public 成员的习惯,而是使用属性。这有几个好处,但主要的好处之一是您现在可以覆盖 属性 的设置方式。例如,如果 SpecificObject1 需要对 Level 做一些与 SpecifictObject2 不同的事情。

此更改如下所示...

public class BaseClass
{
    private string gameObject;
    private bool isAlive;
    private int level;

    public BaseClass(string gameObjectStructure)
    {
        this.gameObject = gameObjectStructure;
        level = 1;
    }

    //don't include a set property to prevent anyone from changing the value
    public string GameObject { get { return gameObject; } }

    //"normal" property which includes a way to set and get the value
    public bool IsAlive { get { return isAlive; } set { isAlive = value; } }

    //Include virtual which allows the child classes to override the behavior
    public virtual Level { get { return level; } set { level = value; } }
}

public SpecificObject : BaseClass
{
    private string levelMessage;

    public SpecificObject(string objectname) : base(objectname)
    {
        //No need to call base.gameObject = objectName; because that is what
        //base(objectname) is doing for you.
        levelMessage = String.Empty;
    }

    //Contrived example showing overrides on a virtual method.
    public override Level 
    {
        get { return base.Level } 
        set { 
                base.Level = value;
                levelMessage = value.ToString();
            } 

    }
}

您还可以做其他事情来改进您的代码,但这应该让您朝着正确的方向开始,并解释您最初关于继承的问题。

我可能已经找到解决办法了。

class Program
{
    static void Main(string[] args)
    {
        SpecificManager specificManager = new SpecificManager();
        SpecificManager2 specificManager2 = new SpecificManager2();
        //...
        specificManager.Manage();
        specificManager2.Manage();
    }
}

public class Manager
{
    dynamic myObject = null;
    public void ManagerInit (dynamic myObject)
    {
        this.myObject = myObject;
    }
    public void Manage()
    {
        if (myObject == null)
            return;
        // deal with BaseClass properties of the SpecificObject
        myObject.isAlive = true;
    }
}

public class SpecificManager : Manager
{
    public SpecificObject myObjectSpec = new SpecificObject("Alfred");
    public SpecificManager ()
    {
        base.ManagerInit(myObjectSpec);
    }
    public void SpecificManage()
    {
        // Manage Attributes of SpecificObject class
        myObjectSpec.level = 2;
        base.Manage();
    }
}
public class SpecificManager2 : Manager
{
    public SpecificObject2 myObjectSpec2 = new SpecificObject2("Alfred2");
    public SpecificManager2 ()
    {
        base.ManagerInit(myObjectSpec2);
    }
    public void SpecificManage2()
    {
        // Manage Attributes of SpecificObject2 class
        myObjectSpec2.description = "Foo";
        base.Manage();
    }
}

public class BaseClass
{
    public string gameObject;
    public bool isAlive;

    public BaseClass(string gameObjectStructure)
    {
        this.gameObject = gameObjectStructure;
    }
}

public class SpecificObject : BaseClass
{
    public int level = 0;
    public SpecificObject(string objectname) : base(objectname)
    {

    }
}

public class SpecificObject2 : BaseClass
{
    public string description = String.Empty;
    public SpecificObject2(string objectname) : base(objectname)
    {

    }
}

在管理器下完成的编译和更改在 SpecificManagers 下很明显。 可怕的是,如果我在 Manage 方法下写一些愚蠢的东西,代码不会在构建时大喊大叫...