我有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
答案 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种选择:
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
}
}
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
}
}