c#编程中继承类中重载和覆盖的问题。。。?

duanaowen 2010-05-05 08:38:48
在学习继承时,说到重载和覆盖的区别,不是很理解。。。
有没有人可以举举例子。。。加深我的理解啊!!
多谢,
...全文
261 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子-顾问 2010-05-05
  • 打赏
  • 举报
回复
呵呵。忘记写了。多谢sp1234来帮忙指正,不然可毒害楼主了。
兔子-顾问 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 sp1234 的回复:]
引用 3 楼 duanaowen 的回复:
那它与覆盖的区别呢 ???
是不执行它了么???


重载跟继承没有关系。重载给覆盖没有可比性。
[/Quote]

就是因为没可比性。所以我直接意会到,可能是想知道override和overload的区别,重载和这些显然无关。
不过……
确实雷,貌似这些名词,英文记得多。毕竟编写代码时候不用中文。
zhoubupt 2010-05-05
  • 打赏
  • 举报
回复
6楼简单明了
xrongzhen 2010-05-05
  • 打赏
  • 举报
回复
所谓重载指的是此类中有两个同名函数(包括继承来的),只是参数不一样




覆盖就是重写基类的方法,在子类中调用这个方法时用的是子类的方法,

//新建一个WinForm
namespace Test
{
public class A
{
public void SayHello()
{
Console.WriteLine("Hello,Base!");
}
}

public class B : A
{
public void SayHello()//重写(覆盖)
{
Console.WriteLine("Hello,Inherit!");
}

public void SayHello(string name)//重载 看参数
{
Console.WriteLine("hello," + name + "!");
}
}

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

A a = new A();
a.SayHello();//访问基类SayHello

B b = new B();
b.SayHello();//访问子类SayHello 重写(覆盖)
b.SayHello("xiao");//重载
//输出结果:
//Hello,Base!
//Hello,Inherit!
//hello,xiao!
}
}
}
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 duanaowen 的回复:]
那它与覆盖的区别呢 ???
是不执行它了么???
[/Quote]

重载跟继承没有关系。重载给覆盖没有可比性。
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jianshao810 的回复:]
你看下继承在内存法的存储方式吧
[/Quote]
认为的是那种“方式”算是标准呢?

不同的编译器、开发语言平台,甚至.net程序在不同环境下的JIT编译成本地代码,内存表示法完全可以不同,但是这些都不必要,不影响对编程语言基本概念的理解。
兔子-顾问 2010-05-05
  • 打赏
  • 举报
回复
嗯。楼主可能不是想知道重载。是4楼的那种疑惑。
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wuyazhe 的回复:]
重载是多态的,覆盖是类型相关的

C# code

public class A
{
//可被子类覆盖
public void OverloadableFunction()
{
MessageBox.Show("A.OverloadableFunction");
}

//可被子类重载实现多态
public ……
[/Quote]
这个回复的雷子把覆盖误认成了重载了!
tangzhiping121603 2010-05-05
  • 打赏
  • 举报
回复
重载:是指同一个类中允许有同名的,但参数类型及个数不完全一致的方法存在,例如:你在类A中定义了方法void MethodA(),如果再定义具有相同名称的方法 int MethodA(int i),这样则称为方法的重载。重载是针对同一个类而言的。

重写(又叫覆盖):重写用关键字override声明,是指父类中定义了某个虚方法,子类需要重新对这个方法进行具体的实现,此则称为重写。如父类中有虚方法virtual void MethidA(int i, string s){ ...; }, 子类重新对其进行实现 override MethodA(int i, string s){ ...; },这样就称为子类重写了父类的方法 MethidA,重写是子类针对父类而言(注意,参数类型及个数须与父类一致, 否则又是重载了!)。
jianshao810 2010-05-05
  • 打赏
  • 举报
回复
重载就是像二楼说的方法名相同,参数不同,重载可以在父类重载也可以在子类重载。
覆盖就是函数签名相同,方法体不同,只能是子类覆盖父类的方法。
啰嗦的讲了一下,不知对你有没有帮助

你看下继承在内存法的存储方式吧
wjp_116 2010-05-05
  • 打赏
  • 举报
回复
重载就是像二楼说的方法名相同,参数不同,重载可以在父类重载也可以在子类重载。
覆盖就是函数签名相同,方法体不同,只能是子类覆盖父类的方法。
啰嗦的讲了一下,不知对你有没有帮助
兔子-顾问 2010-05-05
  • 打赏
  • 举报
回复
另外,这个例子。你自己写才能加深印象,别人写了你怎么能加深印象么?
兔子-顾问 2010-05-05
  • 打赏
  • 举报
回复
重载是多态的,覆盖是类型相关的

public class A
{
//可被子类覆盖
public void OverloadableFunction()
{
MessageBox.Show("A.OverloadableFunction");
}

//可被子类重载实现多态
public virtual void OverridableFunction()
{
MessageBox.Show("A.OverridableFunction");
}

public static void Test()
{
B obj = new B();
//覆盖的方法是根据调用的类型变化的,你转成哪个类型就调用哪个类型的方法
obj.OverloadableFunction();//B.NewFunction
(obj as A).OverloadableFunction();//A.OverloadableFunction
//重载的方法是根据内存对象变化的
obj.OverridableFunction();//B.overrideFunction
(obj as A).OverridableFunction();//B.overrideFunction
}
}

public class B : A
{
public new void OverloadableFunction()
{
MessageBox.Show("B.NewFunction");
}

public override void OverridableFunction()
{
MessageBox.Show("B.overrideFunction");
}
}
GT7466 2010-05-05
  • 打赏
  • 举报
回复

//重载
public void fun(string key1, string key2)
{//... }

public void fun(string key1)
{ //..}
//使用的时候,根据参数的匹配来判断调用的是那个方法

//覆盖
//基类中
public virtual void fun1()
{ }
//子类中覆盖fun1
public override void fun1()
{ }

njw1028 2010-05-05
  • 打赏
  • 举报
回复

// overload
int a(){return 1;}
int a(int a){return a;}
// 方法名相同,参数列表不同,是重载;方法名相同,参数列表相同,返回类型相同,不能抛出更多的异常,是重写
class A
{
int a(int a){return a;}
}
class B : A
{
int a(int b){return b;}
}
q107770540 2010-05-05
  • 打赏
  • 举报
回复
你应该说的是重载和重写吧?

重载不影响原方法

重写影响原方法

就这样。。
duanaowen 2010-05-05
  • 打赏
  • 举报
回复
那它与覆盖的区别呢 ???
是不执行它了么???
sprc_lcl 2010-05-05
  • 打赏
  • 举报
回复
覆盖:
class ClassA
{
public abstract void FunA(int i)
{
//...
}
}

class ClassB : ClassA //继承ClassA
{
public override void FuncA(int i)
{
//...重写FuncA内的东西
}
}
sprc_lcl 2010-05-05
  • 打赏
  • 举报
回复
重载很好理解:
public void FunA(int i)
{
//....
}
public void FunA(int i, int j)
{
//....
}
//参数不同函数名相同就是重载

110,538

社区成员

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

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

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