如何从另一个孩子那里调用孩子被覆盖的方法?

时间:2014-03-17 17:31:16

标签: c# oop inheritance method-overriding

我有3个班级:

ClassA
ClassB : ClassA 
ClassC : ClassA


public class A
{
    public virtual void chop(){

    }
}

public class B:A
{
    public override void chop(){
       print("b.chop");
    }
}

public class C:A
{
    public void call(){
       chop();// Iwanted to print : b.chop 
    }
}

我想从C B调用覆盖方法! 孩子们在运行时创建,我不知道哪一个在哪里! 有没有办法让孩子们互相打电话? TNX

5 个答案:

答案 0 :(得分:1)

来自"覆盖"在C#docs

  

覆盖方法提供了一个成员的新实现   继承自基类。被一个覆盖的方法   覆盖声明称为重写的基本方法。该   重写的基本方法必须与重写具有相同的签名   方法。有关继承的信息,请参阅继承(C#   编程指南)。

你的基类是A,所以这意味着你只能覆盖A中的方法。想一想,你会覆盖哪个C实例?

假设您正在创建实例。

public class C:A
{
    public void call(){
        var b = new B();
        b.chop();// Iwanted to print : b.chop 
    }
}

答案 1 :(得分:1)

C不了解B所以你没有理由在两者之间建立继承关系:

public class C:A
{
    public void call(){
       B b = new B();
       b.chop()
    }
}

答案 2 :(得分:0)

消除重复。目前,您在B和C中重复了call()实现。为它们提取公共基类将完成这项工作:

public class A
{
    public virtual void chop()
    {
    }
}

public abstract class D: A
{
    public override void chop(){
       print("b.chop");
    }   
}

public class B: D
{
   // other members specific to B
}

public class C: D
{   
   // other members specific to C
}

B和C都会打印b.chop

答案 3 :(得分:0)

请注意我在java中编写代码,只需查看逻辑并在C#中实现相同的功能。

Class A
Class B extends A
Class C extends A

public class A
 {
  public virtual void chop(){

 }
}

public class B extends A
{
 @override 
   public void chop(){
   print("b.chop");
}
}

public class C extends A
{
   public void call(A a ){    //make themethod parametarized and pass the object
   a.chop();// Iwanted to print : b.chop 
}
}

当你创建B类的对象时,就像

一样
 A a = new B();
 C c = new C();
 c.call(a);

您将获得所需的输出!!!

答案 4 :(得分:0)

由于B和C彼此不直接相关,因此除了通过C中的B对象外,您将无法从C中调用B中的方法。

据我所知,您有3种选择:

  1. C使用B的对象:

    public class A
    {
        public virtual void chop(){
    
        }
    }
    
    public class B:A
    {
        public override void chop(){
           print("b.chop");
        }
    }
    
    public class C:A
    {
        public void call(){
           var b = new B();
           b.chop();// Iwanted to print : b.chop 
        }
    }
    
  2. B& C继承自中间类:

    public class A
    {
        public virtual void chop(){
    
        }
    }
    
    public class D:A         //taken from Sergey Berezovskiy answer, just for the sake of completeness.
    {
        public override void chop(){
           print("b.chop");
        }
    }
    
    public class B:D
    {
    
    }
    
    public class C:D
    {
        public void call(){
           chop();// Iwanted to print : b.chop 
        }
    }
    
  3. C继承自B:

    public class A
    {
        public virtual void chop(){
    
        }
    }
    
    public class B:A
    {
        public override void chop(){
           print("b.chop");
        }
    }
    
    public class C:B
    {
        public void call(){
           chop();// Iwanted to print : b.chop 
        }
    }