我有三个类:
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的对象。
在我看来,你有三个选择:
-
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 } }
-
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 } }
-
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 } }