Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#继承重写参数_C#_Inheritance - Fatal编程技术网

C#继承重写参数

C#继承重写参数,c#,inheritance,C#,Inheritance,我有一个继承了“经理”的“特定经理”, 我还有一个继承“基类”的“特定对象” 我试图编写的代码是用“管理器”处理“基类”属性,用“特定管理器”处理“特定对象”属性 现在可能很混乱,所以我有一个UML类: 以下是代码的基本内容: class Program { static void Main(string[] args) { SpecificManager ManagerFoo = new SpecificManager(); SpecificM

我有一个继承了“经理”的“特定经理”, 我还有一个继承“基类”的“特定对象”

我试图编写的代码是用“管理器”处理“基类”属性,用“特定管理器”处理“特定对象”属性

现在可能很混乱,所以我有一个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-level放入基类对象中(@Sriram Sakthivel指出,这对于您的类来说不是一个好名字,因为它是c#中最基本的对象),然后两个子类都可以使用它。因此,您的代码至少可以编译并在该点上运行

如下所示(请注意,我已将类名从Object更改为BaseClass,虽然这是一个比Object更好的名称,但仍然不能很好地描述类的功能,因此我也不会使用它)

另一个建议是,首先不要养成使用公共成员的习惯,而是使用属性。这有几个好处,但其中一个主要好处是现在可以覆盖属性的设置方式。例如,如果SpecificObject1需要对级别执行与SpecificToObject2不同的操作

此更改如下所示

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)
    {

    }
}
在特定的管理器中可以很好地看到在管理器下进行的编译和更改。
可怕的是,如果我在Manage方法下编写愚蠢的东西,代码就不会对build大喊大叫……

你真的希望
SpecificManager1
SpecificManager2
分配给
Manager
,还是仅仅为了避免代码重用而使用继承?在后一种情况下,您可能应该使用泛型。不要将
Object
用作类名。Msft已经接受了<代码>对象是.net中所有类的最终基类。您最好选择一个不同的名称以避免混淆。确实同意您关于对象的看法,这是一个(错误选择的)名称以简化我的需要使您的管理器类成为一个对对象有约束的泛型类型,SpecificManager:ManagerI请看这里的要点。因此整数级别在基类中,SpecificObject可以访问它(set+get),并且您可以使用字符串levelMessage获得值信息。我会尝试在基类中不使用Level integer,因为这是特定的,对SpecificObject2来说并不意味着什么。在您的示例中,我有点困惑,您在SpecificObject和SpecificObject2中都放置了一个名为Level的整数。所以看起来级别整数在这两个对象中都有意义。我失败了,因为在SpecificObject2中不存在级别。很抱歉犯了这么大的错误。因为我的问题不清楚,我更新了我的主要问题。(顺便说一句,感谢您对酒店的帮助)
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)
    {

    }
}