C#中有没有可能跳过基类,而调用基类的基类?

yuyue2003 2004-09-16 11:54:12
比如有这样的继承关系:
class Base1 { public virtual func() ... }
class Base2 : Base1 { public override func() ... }
class Base3 : Base2 {
public override func()
{
// 我想在这里调用Base1::func,能否行得通?
// 试过base.base.func(),编译通不过。
}
}

也许别人觉得这样的类层次就有问题。但是在VC中的确是遇到过这样的情况,派生这样的类:
class CMyView : public CView
{
void SomeFunc()
{
// 这里越过CView::SomeFunc而直接调用CWnd::SomeFunc,因为CView::SomeFunc的实现
// 不符合要求
CWnd::SomeFunc();
}
}
在VC中可以直接指定继承层次上的任意一个基类。在C#里面呢,没有办法吗?
...全文
211 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyflyfly663 2004-09-17
  • 打赏
  • 举报
回复
用委托试试
jeffandjeff 2004-09-17
  • 打赏
  • 举报
回复
那看来只有通过对象来访问了
jeffandjeff 2004-09-17
  • 打赏
  • 举报
回复
啊,我说的是回复人: zjsen(离开中...) ( ) 信誉:98
jeffandjeff 2004-09-17
  • 打赏
  • 举报
回复
楼上是强制类型转换啊virtual的估计不行哦
yuyue2003 2004-09-17
  • 打赏
  • 举报
回复
看来还是没有说清楚,再明确一下问题的前提:

在不改动base1和base2的前提下,让base3调用base1中的虚拟方法。


如果我能随便修改base1和base2,那么可行的办法多得很,也就没有必要再为这个问题费脑筋了。
gaobud 2004-09-17
  • 打赏
  • 举报
回复
调用基类的基类: ((Base1)this).func();

但是如果func()是一个虚函数,就会出现一个死循环,继调用Base1.func(); Base1发现func()是一个虚函数,然后就再调用Base3.func(),Base3.func()再调用Base1.func();

如果func()不是一个虚函数是可以的
八爪鱼-杭州 2004-09-17
  • 打赏
  • 举报
回复
可以的,前提是不要使用virtual。使用下面的四个类,你可以有这样的效果
Class3 c3=new Class3();
Class4 c4=new Class4();
string s3= c3.GetValue();//s3="Class1"
string s4= c4.GetValue();//s4="Class2"
--------------------------
public class Class1
{
public Class1(){}
public string GetValue()
{
return "Class1";
}


public class Class2:Class1
{
public Class2(){}
new public string GetValue()
{
return "Class2";
}
}
public class Class3:Class2
{
public Class3(){}
new public string GetValue()
{
return ((Class1)this).GetValue();
}
}
public class Class4:Class2
{
public Class4(){}
new public string GetValue()
{
return ((Class2)this).GetValue();
}
}
boarduck 2004-09-17
  • 打赏
  • 举报
回复
class Base2 : Base1
{
public override func() ...
public funD()
{
base.func();
}
}
Base2类里写个方法调用基类。。
yuyue2003 2004-09-17
  • 打赏
  • 举报
回复
flower_open(宫爆鸡丁) :
直接调用我也估计是不成的。但是确实有这样的需要,有没有间接的办法,比如反射什么的?

goodluck001(Endeavoring):
谢谢,但是那样不符合要求。我希望方法的作用效果是对于Base3本身,而不是另外一个临时的Base1对象。

goodluck001 2004-09-17
  • 打赏
  • 举报
回复

virtual函数主要是用来应对多态的,所以在override函数里面可以直接调用直接基类的方法,但要调用直接基类的基类可能只有通过实例来实现了,比如:

class Base1 { public virtual func() ... }
class Base2 : Base1 { public override func() ... }
class Base3 : Base2 {
public override func()
{
// 我想在这里调用Base1::func,能否行得通?
// 试过base.base.func(),编译通不过。
Base1 b1=new Base1();
b1.func();

。。。。
}
}
flower_open 2004-09-16
  • 打赏
  • 举报
回复
不可以,这个问题我上次已经问过了,没有结果!

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧