override 与 new 区别

kdymh 2008-04-15 10:40:52
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication2
{
abstract public class contact
{
public virtual string prinf()
{
return ("这是虚方法论");
}
}
public class class1 : contact
{
public override string prinf()
{
return ("这是新的方法论");
}
}
public class class2 : contact
{
public new string prinf1()
{
return ("这是另一个新的方法");
}
}
class Program
{
static void Main(string[] args)
{
contact[] contacts = new contact[2];
contacts[0]=new class1();
contacts[1]=new class2();
foreach(contact ct in contacts )
{
Console.WriteLine(ct.prinf());
}
Console.ReadLine();
}
}
}

结果
这是新的方法
这是虚方法

为什么结果不是

这是新的方法
这是另一个新的方法法

override 与 new 有什么关系?
我要怎么才能得到
结果:
这是新的方法
这是另一个新的方法法
...全文
157 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
welcome316 2008-04-16
  • 打赏
  • 举报
回复
类的方法是virtual,子类不是用override,而是用new来覆盖了,

那么运行子类的时候,还是执行声明的类的方法

所以会输出这是虚方法

但把它转换成class2后,就可以得到想要的结果了

Console.WriteLine(((class2)contacts[1]).prinf());

这是另一个新的方法法
schoollong 2008-04-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bingshan24 的回复:]
额..

override是重写父类里用virtual或abstruct修饰的方法..

new是隐藏父类就是方法...
[/Quote]

是隐藏不是覆盖,所以隐藏的仍然还存在,还可以调用
override的那就覆盖了,没了
ai0ai 2008-04-16
  • 打赏
  • 举报
回复
另外,对于你二楼的例子
1、OB并没有重载OA的方法,也许你的意思是重写了?的确重写了
2、class A并没有声明了virtual的方法,所以它的子类class B中用到的new修饰是多余无效的

再请你仔细看调用的对象
OA oa = new OA();
OB ob = new OB();
oa.print();
ob.print();
如果之前你调用的是class2.prinf(),我想你就得到你想要得结果了
ai0ai 2008-04-16
  • 打赏
  • 举报
回复
1、数组contact[] contacts 是基类类型
2、访问数组使用的foreach(contact ct in contacts )迭代
虽然数组中的对象是两个子类,但是类的多态性使得访问结果是将子类强类型转换为基类
对于class1,采用的override基类方法,形同覆盖,所以得到的结果是class1.prinf()结果
对于class2,采用new的方式,形同存在两个prinf方法,一个是base.prinf(),另一个则是this.prinf()
所以实际上是调用了(contact)class2.prinf(),故而结果是contact.prinf(),而不是class2.prinf()的结果
milizi820 2008-04-16
  • 打赏
  • 举报
回复
结果
这是新的方法
这是虚方法

为什么结果不是

这是新的方法
这是另一个新的方法法

override 与 new 有什么关系?
我要怎么才能得到
结果:
这是新的方法
这是另一个新的方法法
主要是因为“contacts[1]=new class2(); ”中用contacts去实例化它的子类对象,在调用方法的时候它会调用父类的return()方法,而不是调用子类的return()方法。
龙宜坡 2008-04-16
  • 打赏
  • 举报
回复
override是实现
new是覆盖
卧_槽 2008-04-16
  • 打赏
  • 举报
回复
从继承的结构上来说
override的执行,是查找父类中的函数入口点,再通过父类函数后期绑定决定执行的代码块
new的执行,是直接查找子类中的函数入口点,直接执行。
virusswb 2008-04-16
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication2
{
abstract public class contact
{
public virtual string prinf()
{
return ("这是虚方法论");
}
}
public class class1 : contact
{
public override string prinf()
{
return ("这是新的方法论");
}
}
public class class2 : contact
{
public new string prinf1()//楼主这里写错了吧,如果是printf1就没有必要加上new,因为基类就没有printf1这个方法,如果是 //printf就可以加上new来屏蔽基类的同名方法。
{
return ("这是另一个新的方法");
}
}
class Program
{
static void Main(string[] args)
{
contact[] contacts = new contact[2];
contacts[0]=new class1();
contacts[1]=new class2();
foreach(contact ct in contacts )
{
Console.WriteLine(ct.prinf());
}
Console.ReadLine();
}
}
}
virusswb 2008-04-16
  • 打赏
  • 举报
回复
override是重写父类的同名方法,实现多态的时候要用到
new是隐藏父类的实现,用自己的实现
下面的这个可以,强制类型转化成class2
abstract public class contact
{
public virtual string prinf()
{
return ("这是虚方法论");
}
}
public class class1 : contact
{
public override string prinf()
{
return ("这是新的方法论");
}
}
public class class2 : contact
{
public new string prinf()
{
return ("这是另一个新的方法");
}
}
class Program
{
static void Main(string[] args)
{
contact[] contacts = new contact[2];
contacts[0] = new class1();
contacts[1] = new class2();

Console.WriteLine( contacts[0].prinf());
Console.WriteLine(((class2)contacts[1]).prinf());

Console.ReadLine();
}
}
fly_to_sky 2008-04-16
  • 打赏
  • 举报
回复
override重写父类方法
new 覆盖父类方法 或者说是子类定义的新方法只是同名而已
这是我的个人认为,仅做参考!
kdymh 2008-04-16
  • 打赏
  • 举报
回复
如果
new是隐藏父类就是方法...

应该是执行的是这下面的一句
public class class2 : contact
{
public new string prinf1()
{
return ("这是另一个新的方法");
}
}

不知理解的有没有错
kdymh 2008-04-16
  • 打赏
  • 举报
回复
是写错了应是prinf
schoollong 2008-04-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ai0ai 的回复:]
1、数组contact[] contacts 是基类类型
2、访问数组使用的foreach(contact ct in contacts )迭代
虽然数组中的对象是两个子类,但是类的多态性使得访问结果是将子类强类型转换为基类
对于class1,采用的override基类方法,形同覆盖,所以得到的结果是class1.prinf()结果
对于class2,采用new的方式,形同存在两个prinf方法,一个是base.prinf(),另一个则是this.prinf()
所以实际上是调用了(contact)class2.prinf(),故…
[/Quote]

这个解释应该是正确的,关键在于你声明的是contact数组: contact[] contacts = new contact[2]
kdymh 2008-04-16
  • 打赏
  • 举报
回复
感谢各位的回复,现在明白了,谢谢大家
我姓区不姓区 2008-04-15
  • 打赏
  • 举报
回复
首先我不知道楼主有没有写错,你class2里那个隐藏方法的函数名是prinf1,和基类的prinf本来就不一样
如果你是写错了的话,那么原因就是ct你声明的是contact类型,contacts[0]是class1类型的,其prinf()有override版本,所以调用class1的prinf(),而contacts[1]是class2类型的,其pirnf()隐藏了基类的prinf()方法,所以ct只能调用基类的prinf()方法了
如果你把ct声明为Class2,那么prinf()返回的就是"这是另一个新的方法"了
bingshan24 2008-04-15
  • 打赏
  • 举报
回复
额..

override是重写父类里用virtual或abstruct修饰的方法..

new是隐藏父类就是方法...
kdymh 2008-04-15
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication3
{
public class A
{
public void print()
{
Console.WriteLine("This is the Class A");
}
}

public class B : A
{
public new void print()
{
Console.WriteLine("This is the Class B");
}
}

public class OA
{
public virtual void print()
{
Console.WriteLine("This is the Class OA");
}
}

public class OB : OA
{
public new void print()
{
Console.WriteLine("This is the Class OB");
}
}

public class MainEntryPoint
{
public static void Main()
{
A a = new A();
B b = new B();
a.print();
b.print();

OA oa = new OA();
OB ob = new OB();
oa.print();
ob.print();
}
}

}
结果

This is the Class A
This is the Class B
This is the Class OA
This is the Class OB

为什么OB却重载了OA 的方法


而前贴却没有重载prinf

110,499

社区成员

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

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

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