如何从其他孩子调用孩子的覆盖方法?



我有三个类:

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 
    }
}

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

来自c#文档中的"override"

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

你的基类是A,所以这意味着你只能重写来自A的方法。想想看,你会重写C的哪个实例?

假设你正在创建实例。

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

C不知道B,所以你没有理由在两者之间有继承关系:

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

消除重复。目前你在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

请注意,我正在用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);

您将得到所需的输出!!

由于B和C彼此之间没有直接关系,您将无法从C中调用B中的方法,除非通过C中B的对象。

在我看来,你有三个选择:

  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. Both 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 
        }
    }
    

最新更新