自已总结下new与override
就自已总结下,平常经常用,半懂不懂状态,今天总结下,清楚多了,嘿嘿
引用AnyTao博客中的一句话:
覆写(override)与重载(overload),是成就.NET面向对象多态特性的基本技术之一
正如某网友说的那一句话:
Override 覆写 就是把原来的换掉了
new 新的 就是两个共存着
通过接口比较
如果希望 覆载 基类方法,你需要使用override(也即是告诉全世界,他儿子成年了,能自已负起责任)
用书里的一句话描述new吧:只有在处理对子类的显式引用时,new修饰符才会提供子类的行为(必须有virtual好像)
如果你想提供基类的行为,使用new指令(有无virtual无所谓)
其实从继承来说,先是访问其父类(通过接口),然后如果其子类有override或者显示的实现了父类的方法,就找子类,如没有,则找父类
public class A:Itrace
{
public vortual void TraceSelf()//virtual是可选的
{
打印"A"
}
}
public class B:A
{
public new void TraceSelf()
{
打印B
}
}
而无论是Itrace obj=new B
还是A obj=new B
都是打印出"A",除非显示的接口
public class B:A,ITrace
{
}
而以下代码则是根据此类为依据而对几种情况的假设而得出的,
没什么技术含量,但如能亲手打一遍,总觉得比看书还重要,其实学习的过程也是这样的
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace Inte
{
public interface ITrace
{
void TraceSelf();
}
public class A : ITrace
{
#region ITrace 成员 隐式
public virtual void TraceSelf()
{
Console.WriteLine("a");
}
#endregion
}
public class B : A, ITrace
{
#region ITrace 成员 隐式
public override void TraceSelf()
{
Console.WriteLine("b");
}
#endregion
//#region ITrace 成员 显示
//void ITrace.TraceSelf()
//{
// Console.WriteLine("The method or operation is not implemented.");
//}
//#endregion
}
class Program
{
static void Main(string[] args)
{
//A obj = new B();
//Console.WriteLine("此时是new,且 A obj = new B()");
//此时是new了一个,但是是隐式的
/*********************************/
//此时是new,且 A obj = new B()
//a
//虽然有new ,但只有在处理显示引用时,NEW才有用
/**************************/
//obj.TraceSelf();
//此时是new了一个,但是是显式的
/*********************************/
//但其实还是同上一样的结果
//因为此时引用的是"A"
//所以其实访问的都是A的,不管是否有new
//此时代码还是跟上面的一样,
B obj = new B();
obj.TraceSelf();
//此时是显示的实现了接口
//则打印:"The method or operation is not implemented."
//而当把其显示部分注释掉时
//void ITrace.TraceSelf()
//{
// Console.WriteLine("The method or operation is not implemented.");
//}
//打印结果是b
//此时,NEW才起作用
//而此时再把NEW改成override
//此时打印的也是B
//而如果此时不显示的实现接口
//则NEW依然是打印A
//而OVERRIDE是打印b
//以上结论,new只有在显示的实在接口上才有用
//因为此时等同于重新实现了一此类的接口
//但即使是显示的有接口了,但如果有显示的实现了
//NEW的也是被忽略掉了
Console.ReadLine();
}
}
}
而以下的是以抽象类为例写的,是参考lifengguo 's Blog
也就是抄过来的,哈哈,http://www.cnblogs.com/lifengguo/archive/2007/06/13/781704.html
我觉得这篇写的挺好的,也就照着写了一遍,加深印象,与各位分享下,嘿嘿
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication4
{
abstract class Base
{
public abstract void Pay(); //声明抽象方法,必须要被子类new 或 override;只有当类是abstract时才可以声明abstract方法
public virtual void work()
{
Console.WriteLine("基类--开始工作");
}
public virtual void outwork()
{
Console.WriteLine("基类--下班");
}
}
class Employee : Base
{
public new void work()
{
Console.WriteLine("子类(new)--开始工作");
}
public override void outwork()
{
Console.WriteLine("子类(override)下班");
}
public override void Pay() //此时必须是override
{
Console.WriteLine("The method or operation is not implemented.");
}
}
class Program
{
static void Main(string[] args)
{
//第一种情况
//Employee emp = new Employee();
//emp.work(); //子类(new)--开始工作
//emp.outwork(); //子类(override)下班
//第二种情况
//Employee emp = new Employee();
//Base b = (Base)emp; //指向抽象类了
//b.work(); //基类--开始工作
//b.outwork(); //子类(override)下班
//第三种情况
Base b = new Employee();
//同上面是一样的
b.work(); //基类--开始工作
b.outwork(); //子类(override)下班
Console.ReadLine();
}
}
}
那位达人能告诉我那种黑色背景贴代码是怎么搞出来的呀,小弟新手,郁闷了,代码乱七八糟,但我觉得COPY过去自已改改,那样理解起来才重要,
望达人相告
谢谢
引用AnyTao博客中的一句话:
覆写(override)与重载(overload),是成就.NET面向对象多态特性的基本技术之一
正如某网友说的那一句话:
Override 覆写 就是把原来的换掉了
new 新的 就是两个共存着
通过接口比较
如果希望 覆载 基类方法,你需要使用override(也即是告诉全世界,他儿子成年了,能自已负起责任)
用书里的一句话描述new吧:只有在处理对子类的显式引用时,new修饰符才会提供子类的行为(必须有virtual好像)
如果你想提供基类的行为,使用new指令(有无virtual无所谓)
其实从继承来说,先是访问其父类(通过接口),然后如果其子类有override或者显示的实现了父类的方法,就找子类,如没有,则找父类
public class A:Itrace
{
public vortual void TraceSelf()//virtual是可选的
{
打印"A"
}
}
public class B:A
{
public new void TraceSelf()
{
打印B
}
}
而无论是Itrace obj=new B
还是A obj=new B
都是打印出"A",除非显示的接口
public class B:A,ITrace
{
}
而以下代码则是根据此类为依据而对几种情况的假设而得出的,
没什么技术含量,但如能亲手打一遍,总觉得比看书还重要,其实学习的过程也是这样的
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace Inte
{
public interface ITrace
{
void TraceSelf();
}
public class A : ITrace
{
#region ITrace 成员 隐式
public virtual void TraceSelf()
{
Console.WriteLine("a");
}
#endregion
}
public class B : A, ITrace
{
#region ITrace 成员 隐式
public override void TraceSelf()
{
Console.WriteLine("b");
}
#endregion
//#region ITrace 成员 显示
//void ITrace.TraceSelf()
//{
// Console.WriteLine("The method or operation is not implemented.");
//}
//#endregion
}
class Program
{
static void Main(string[] args)
{
//A obj = new B();
//Console.WriteLine("此时是new,且 A obj = new B()");
//此时是new了一个,但是是隐式的
/*********************************/
//此时是new,且 A obj = new B()
//a
//虽然有new ,但只有在处理显示引用时,NEW才有用
/**************************/
//obj.TraceSelf();
//此时是new了一个,但是是显式的
/*********************************/
//但其实还是同上一样的结果
//因为此时引用的是"A"
//所以其实访问的都是A的,不管是否有new
//此时代码还是跟上面的一样,
B obj = new B();
obj.TraceSelf();
//此时是显示的实现了接口
//则打印:"The method or operation is not implemented."
//而当把其显示部分注释掉时
//void ITrace.TraceSelf()
//{
// Console.WriteLine("The method or operation is not implemented.");
//}
//打印结果是b
//此时,NEW才起作用
//而此时再把NEW改成override
//此时打印的也是B
//而如果此时不显示的实现接口
//则NEW依然是打印A
//而OVERRIDE是打印b
//以上结论,new只有在显示的实在接口上才有用
//因为此时等同于重新实现了一此类的接口
//但即使是显示的有接口了,但如果有显示的实现了
//NEW的也是被忽略掉了
Console.ReadLine();
}
}
}
而以下的是以抽象类为例写的,是参考lifengguo 's Blog
也就是抄过来的,哈哈,http://www.cnblogs.com/lifengguo/archive/2007/06/13/781704.html
我觉得这篇写的挺好的,也就照着写了一遍,加深印象,与各位分享下,嘿嘿
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication4
{
abstract class Base
{
public abstract void Pay(); //声明抽象方法,必须要被子类new 或 override;只有当类是abstract时才可以声明abstract方法
public virtual void work()
{
Console.WriteLine("基类--开始工作");
}
public virtual void outwork()
{
Console.WriteLine("基类--下班");
}
}
class Employee : Base
{
public new void work()
{
Console.WriteLine("子类(new)--开始工作");
}
public override void outwork()
{
Console.WriteLine("子类(override)下班");
}
public override void Pay() //此时必须是override
{
Console.WriteLine("The method or operation is not implemented.");
}
}
class Program
{
static void Main(string[] args)
{
//第一种情况
//Employee emp = new Employee();
//emp.work(); //子类(new)--开始工作
//emp.outwork(); //子类(override)下班
//第二种情况
//Employee emp = new Employee();
//Base b = (Base)emp; //指向抽象类了
//b.work(); //基类--开始工作
//b.outwork(); //子类(override)下班
//第三种情况
Base b = new Employee();
//同上面是一样的
b.work(); //基类--开始工作
b.outwork(); //子类(override)下班
Console.ReadLine();
}
}
}
那位达人能告诉我那种黑色背景贴代码是怎么搞出来的呀,小弟新手,郁闷了,代码乱七八糟,但我觉得COPY过去自已改改,那样理解起来才重要,
望达人相告
谢谢