晕了,面向对象的多态性,大家帮帮忙呀.....在线等..

ZiRRen 2006-10-26 10:38:44
namespace Test
{
public class SuperA
{
public void Fun()
{
System.Console.WriteLine("This is SuperA");
}
}
public class SubB:SuperA
{
public void Fun()
{
System.Console.WriteLine("This is SubB");
}

}

public class basemain
{
public static void Main()
{
SuperA test=new SubB();//第一种写法
test.Fun();

SuperA supera; //第二种写法
SubB subclass = new SubB();
supera = subclass;
supera.Fun();

}
}
}

::::::第一种写法:::::::

因为有两个相同的Fun()方法,所以会出一个Warning,说子类的隐藏了基类的方法,但是仍然可以执行,
但是为什么结果是执行的SuperA里的Fun(),而不是SubB的Fun(),在Java中完全合法,并且执行的是SubB中的方法.(这里实在是不明白)?!!
子类中不是已经隐藏了吗?可以用new关键字来隐藏,但是那还有什么意义,相当于一个新方法了,直接改名就可以了.

:::::::第二种写法:::::::

SuperA supera;//在堆上创建一个supera引用.
SubB subclass=new class();//在堆上创建一个subclass的引用,并在堆栈上分配空间
supera=subclass;//supera引用指向subclass的空间
supera.Fun();//这里应该是执行的SubB中的Fun()方法吧,但结果却是SuperA中的方法,请指点.

谢谢!~~~非常感谢..在线等.
...全文
250 20 打赏 收藏 举报
写回复
20 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wheeler 2006-10-27
  • 打赏
  • 举报
回复
说简单一点就是 Java里new和override可以是隐式的,但在.NET中必须显式说明,不然系统直接调用最匹配的!
ZiRRen 2006-10-27
  • 打赏
  • 举报
回复
我的理解:

如果在java中完全可以也不会有警告,并把基类的方法给隐藏了.这很好的体现在了多态性.
对于.net,发出警告不能够隐藏基类的方法Fun(),当然,可以用new ,virtual/abstact+override来实现,其实就是一个新的方法了.也就是说这种用基类来声明子类的实例的方法对于.net不是很好用.它都用 子类 name=new 子类();(声明子类的实例)这种方法来隐藏基类的方法, 这样做感觉有点麻烦.不如java的机制好.
viena 2006-10-26
  • 打赏
  • 举报
回复
public class SubB:SuperA
{
public void Fun()
{
System.Console.WriteLine("This is SubB");
}
}
相当于
public class SubB:SuperA
{
public new void Fun()
{
System.Console.WriteLine("This is SubB");
}
}

另,如果不用new,用override重写基类的方法
基类的方法前应有virtual修饰符,表明是虚方法

viena 2006-10-26
  • 打赏
  • 举报
回复
不是这个new
是本该写override的地方,派生类中方法名前面
不写override,默认就认为是new
如果你写了new,就不会有Warning了
ZiRRen 2006-10-26
  • 打赏
  • 举报
回复
viena(维也纳nn),你说是使用new关键字以派生成员替换基类的成员,在派生类中基类的方法被隐藏了.那SuperA test=new SubB();这样是不是就把基类的Fun()方法给隐藏了,应该输出的是This is SubB,虽然它有个Warnning.
viena 2006-10-26
  • 打赏
  • 举报
回复
在派生类中被隐藏了,但在基类中方法仍然是存在的
viena 2006-10-26
  • 打赏
  • 举报
回复
使用new关键字以派生成员替换基类的成员,在派生类中基类的方法被隐藏了
如果用基类来调用,当然调用的是基类的方法,没有多态
只有用override关键字覆盖基类的方法,才会有多态
wings0201 2006-10-26
  • 打赏
  • 举报
回复
2 种方法一样(就你所说的机制), 只是第2中写来写去再自己绕圈子
ZiRRen 2006-10-26
  • 打赏
  • 举报
回复
楼上的我知道可以这样,我就是想知道我这种情况是怎么样的一个机制?

谢谢..
lxwin01 2006-10-26
  • 打赏
  • 举报
回复
namespace Test
{
public class SuperA
{
public virtual void Fun()
{
System.Console.WriteLine("This is SuperA");
}
}
public class SubB:SuperA
{
public oerrider void Fun()
{
System.Console.WriteLine("This is SubB");
}

}

public class basemain
{
public static void Main()
{
SuperA test=new SubB();//第一种写法
test.Fun();

SuperA supera; //第二种写法
SubB subclass = new SubB();
supera = subclass;
supera.Fun();

}
}
}
ZiRRen 2006-10-26
  • 打赏
  • 举报
回复
第二种能不能详细解释一下,怎么进行底层分配的?
wings0201 2006-10-26
  • 打赏
  • 举报
回复
2 种写法没什么区别。只是因为你没有用override, subB.Func() 不会覆盖 subA 的 Fun().
Eilien 2006-10-26
  • 打赏
  • 举报
回复
帮顶.
wings0201 2006-10-26
  • 打赏
  • 举报
回复
c# 里面要用 override 的关键字
java 不用
ZiRRen 2006-10-26
  • 打赏
  • 举报
回复
两个执行在Java中都是相反的和C#中,面向对象的东西都是一样的吧,怎么会这样呢.?

谢谢!~
viena 2006-10-26
  • 打赏
  • 举报
回复
方法是与类同时加载的,而不是与实例,由各个实例共享的
难道你觉得有必要为每个实例复制一份吗?
viena 2006-10-26
  • 打赏
  • 举报
回复
你的两种写法没有什么区别

不要说在Java中怎样,.NET中就是这样定义的,就像Java中就是那样定义的一样
viena 2006-10-26
  • 打赏
  • 举报
回复
前面我给你说得很清楚了,再重复一遍:

在派生类中隐藏基类的方法时,是在派生类中隐藏了基类的方法
但基类的原方法仍然是存在的
如果用基类类型的对象来调用,当然调用的是基类的方法,是没有多态的

另帮你澄清一下基础知识:
方法不是在堆或者堆栈上分配内存的,是作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的;方法在类型第一次被使用时加载
你说的怎么分配的空间什么的与这个问题一点关系也没有,只有对象的包含的数据才会在数据区分配空间
ZiRRen 2006-10-26
  • 打赏
  • 举报
回复

:::::::::::::::::谁能给我用我的那种方式讲解一下那[第二种]::::::::::::::::::::::::::

按照堆或者堆栈的顺序.以及怎么分配的空间.
ZiRRen 2006-10-26
  • 打赏
  • 举报
回复
我知道用new可以隐藏基类的方法,我也知道用虚拟然后override可以,你没有明白呀?

我只想讨论我这种情况,不用帮我改了!

谢谢!!!
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2006-10-26 10:38
社区公告

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