2017-08-28 72 views
-6

我需要继承一个真正的类,我的意思不是一个抽象类。我需要一个新的行为。c#继承不起作用

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

+1

什么可怕的命名约定如此混乱的代码。 – JonH

+0

[了解何时使用覆盖和新关键词](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/knowing-when-to-use-override-和新关键字) –

+0

固定命名约定... – JonH

回答

4

您需要标记cal()方法virtual in parentclass and override它在childclass

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; 
     } 
    } 
} 
+0

同名并坚定?那是什么(公司)? – JonH

+0

@JonH - 谁知道,但它也在OP中。可能只是复制/粘贴,然后在适当的位置添加虚拟+覆盖。 – Igor

+0

这就是我所做的:)。我假设他的意思是方法和父母有相同的签名。 – AlexDrenea

1

基本上,当你定义像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; 
     } 
    } 
} 
+0

两件事。 1)我非常肯定,你并不想在你的第一行中在你的方法定义中包含'virtual'。这个错误使得整个句子对于noob而言相当混乱。 2)重载类*可以*也可以通过使用'new'关键字来改变它自己的行为。 – Igor

+0

谢谢!我确实没有。固定! 'new'关键字是默认行为(基本上隐藏了警告)。只有在该类的上下文中调用方法时,使用'new'关键字的覆盖类才有效。例如,在上面的例子中使用'new'关键字'childClass child = new childClass; child.cal();'会导致1,如预期。但是,'ParentClass parent = new childClass; parent.cal();'会导致2. –

+0

多亏了所有,是的,我的英语非常差,我明白我不能覆盖非虚拟或抽象的方法。 https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/inheritance –