【问题标题】:c# inheritance does not work [closed]c#继承不起作用[关闭]
【发布时间】:2017-08-28 20:04:17
【问题描述】:

我需要子类化一个真正的类,我的意思不是抽象类。我需要一种新的行为。

namespace MyProgram
{
    public class ParentClass
    {
        public int Calc(int a)
        { 
            return a + this.Cal();
        }

        public int Cal()
        {
            return 2;
        } 
    }

    public class ChildClass : ParentClass
    {
        public int Cal()
        {
            return 1;
        }
    }   
}   

在主程序中,我尝试了以下操作:

ChildClass childClass = new ChildClass();
int a = childClass.calc(3);

但是,a 的值是 5,而不是 4。

【问题讨论】:

  • 多么糟糕的命名约定,如此混乱的代码。
  • 固定命名约定...
  • 您在编译代码时是否偶然发现了警告?您阅读这些警告了吗?
  • @TobiasTheel:由于缺乏研究,我投了反对票。提供的代码会生成一个警告,并且该警告有据可查。勤于研究意味着不需要这个问题。

标签: c# asp.net .net


【解决方案1】:

你需要将cal()方法标记为parentclass中的virtual和childclass中的override。

namespace MyProgram
{
    public class ParentClass
    {
        public int calc( int a)
        { 
            return a + this.cal();
        }

        public virtual int cal()
        {
            return 2;
        } 
    }

    public class childClass : ParentClass
    {
        public override int cal() // same name and firm 
        {
            return 1;
        }
    }
}

【讨论】:

  • 同名公司?那是什么(公司)?
  • @JonH - 谁知道,但它也在 OP 中。可能只是复制/粘贴,然后在适当的地方添加 virtual + 覆盖。
  • 这就是我所做的:)。我假设他的意思是方法与父方法具有相同的签名。
【解决方案2】:

基本上,当您定义像public int cal() { return 2; } 这样的方法时,您是在说它将永远这样。这样,当它在类 (return a + this.cal()) 内部被调用时,它甚至不会尝试找到不同的实现。如果您想拥有覆盖实现的选项,则必须将该方法标记为virtual。在子类中,当您要覆盖该方法时,您必须使用override 关键字明确说明它是一个覆盖。

namespace MyProgram
{
    public class ParentClass
    {
        public int calc( int a) { return a + this.cal(); }
        public virtual int cal() { return 2; }
    }

    public class childClass : ParentClass
    {
        public override int cal()
        {
            return 1;
        }
    }
}

【讨论】:

  • 两件事。 1)我很确定您并不是要在第一行的方法定义中包含virtual。这个错误使整个句子对于菜鸟来说相当混乱。 2) 覆盖类可以也可以通过使用new关键字来改变它自己的行为。
  • 谢谢!我没有,确实。固定的! new 关键字是默认行为(基本上只是隐藏警告)。使用new 关键字的覆盖类仅在该类的上下文中调用该方法时才有效。例如,在上面的示例中使用 new 关键字,childClass child = new childClass; child.cal(); 的结果将得到 1,正如预期的那样。但是,ParentClass parent = new childClass; parent.cal(); 将产生 2。
  • 谢谢大家,是的,我的英语很差,我知道我无法覆盖非虚拟或抽象方法。 docs.microsoft.com/en-us/dotnet/csharp/tutorials/inheritance
猜你喜欢
  • 1970-01-01
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
相关资源
最近更新 更多