代码如下:
public class a//重载
{
public void a1()
{
Console.WriteLine("这是基类的输出:");
}
}
public class b : a
{
public new void a1()
{
string name;
string id;
Console.Write("输入你的名字:");
name = Console.ReadLine();
Console.Write("输入你的学号:");
id = Console.ReadLine();
Console.WriteLine("你好{0}",name);
Console.WriteLine("你的学号是{0}", id);
}
public class cx//重写 {
public virtual void a1()
{
Console.WriteLine("这是基类的输出:");
}
}
public class cx1 : cx
{
public override void a1()
{
string name;
string id;
Console.Write("输入你的名字:");
name = Console.ReadLine();
Console.Write("输入你的学号:");
id = Console.ReadLine();
Console.WriteLine("你好{0}",name);
Console.WriteLine("你的学号是{0}", id);
}
}
结果是一样的:那区别在那里。它们好处都在那里。
public class a//重载
{
public void a1()
{
Console.WriteLine("这是基类的输出:");
}
}
public class b : a
{
public new void a1()
{
string name;
string id;
Console.Write("输入你的名字:");
name = Console.ReadLine();
Console.Write("输入你的学号:");
id = Console.ReadLine();
Console.WriteLine("你好{0}",name);
Console.WriteLine("你的学号是{0}", id);
}
public class cx//重写 {
public virtual void a1()
{
Console.WriteLine("这是基类的输出:");
}
}
public class cx1 : cx
{
public override void a1()
{
string name;
string id;
Console.Write("输入你的名字:");
name = Console.ReadLine();
Console.Write("输入你的学号:");
id = Console.ReadLine();
Console.WriteLine("你好{0}",name);
Console.WriteLine("你的学号是{0}", id);
}
}
结果是一样的:那区别在那里。它们好处都在那里。
例如重写会覆盖基类的方法,但我用new初始化(cx a1234=new cx; a1234.a1();)得到的结果并不是所说的覆盖。
new只是隐藏父类的基方法,override覆盖父类的基方法
区别在于
父类 instance=new 子类();
instance.基方法();试下就知道了。。
http://wenku.baidu.com/view/133527fe910ef12d2af9e7bd.html
a1234.a1();//调用的是子类的方法
它们的方法签名不同,但是方法名称相同,这家做重载。比如c#中许多基本符号可以重载,比如你可以重载+号用于Person对象之间,结果就像var child=Person1+Person2;你在Person类上定义一个重载+号的方法,它接受两个Person类型的参数,判断这两个Person是否符合配对标准,然后new出来一个新的Person。
重写则是针对继承的,表示子类可以修改父类的方法实现。如果你没有写过那些需要将来对某个class或者interace的子类对象都可执行的方法,就还是没有理解继承概念了。
这也是重载,因为它们的方法参数签名不同,而方法名相同。
int Add(int a, int b)
{
return a + b;
}int mul(int a, int b)
{
return a * b;
}
int power(int a, int b)
{
int r = 1;
for (i = 1; i <= b; i++) r *= a;
return r;
}调用:
Console.WriteLine(add(2, 2));
Console.WriteLine(mul(2, 2));
Console.WriteLine(power(2, 2));结果是一样的。那么你告诉我三个函数哪个的优点是什么?
其实重载跟面向对象不搭界,于是也就谈不上你说的什么“隐藏父类,执行子类”。而继承的目的是让原本冲着父类、接口而设计的程序可以正常运行,比如我们写下了一段关于“生鲜商品”对象的销售盘点程序(例如需要登记它的重量、总金额、合理的损耗、保鲜日期等等信息),那么这段程序写下之后可能过了2年,新的生鲜商品增加了几十种,我们拿出最新定义任何一个子类的对象,还去运行原来这段处理程序,仍然可以通过软件测试。而你的所谓“隐藏父类、执行子类”其实是空洞无物的。如果我们用“铅笔盒”作为生鲜商品,程序就会抛出异常而中断。因此面向对象强调的不是编程语言的形式,而是首先用应用领域的术语来定义,避免用OOPL语言去实现机械化、诡异的代码(有些人为了少写一点代码,于是让Studen类继承自School类,这就给将来程序扩展和应用的稳定性、可理解性带来的问题)。而至于你说让子类new一个同样名称同样参数签名的方法(注意是同样参数签名,所以根本不是什么重载),跟上述生鲜商品处理流程的可继承性没有半点关系!它纯粹是闲的没事时,偏要让另外一个无关的方法跟父类的方法重名,所以这几乎应该是被禁止的做法。只不过早期的.net的clr从c++中继承了这个语法,或者说不得不支持多种早期编程语言的写法而已。