新手菜鸟学习C#的笔记总结 之多态
2014-01-26 23:49
651 查看
本人是初学菜鸟,有错误的地方欢迎大家指正。
多态的定义:同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的结果。有两种形式:
1,编译时的多态,体现在重载上,根据传递的参数,返回值,来决定实现的操作。
2,运行时的多态,体现在虚方法上,运行时,根据实际情况来决定实现何种操作。
具体多态的情况:
1,虚方法:通过virtual来实现。可以有方法体,可以被继承类重写。
2,抽象方法:通过关键字abstract 来实现,可以看做没有方法体的虚方法。
3,密封方法:通过关键词sealed来实现,密封方法可以防止该方法被重载。
4,方法的隐藏:通过关键词new来实现,继承类,可以改变继承自基类的方法。但被转换为基类时,会调用基类的方法。
5,抽象类:通过关键字abstract来实现,可以作为基类,但不能直接实例化。不能是密封类。
6,密封类:通过关键词sealed来实现,目的是防止类被继承。
总结:
多态的定义:同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的结果。有两种形式:
1,编译时的多态,体现在重载上,根据传递的参数,返回值,来决定实现的操作。
2,运行时的多态,体现在虚方法上,运行时,根据实际情况来决定实现何种操作。
具体多态的情况:
1,虚方法:通过virtual来实现。可以有方法体,可以被继承类重写。
class Phone { public virtual void displayInfo() { Console.WriteLine("Phone"); } } class HuaweiPhone : Phone { public override void displayInfo() { Console.WriteLine("HuaweiPhone"); } } class Program { static void Main(string[] args) { Phone p1 = new Phone(); HuaweiPhone p2 = new HuaweiPhone(); p1.displayInfo(); p2.displayInfo(); p1 = p2; p1.displayInfo(); } } 输出结果 Phone HuaweiPhone HuaweiPhone
2,抽象方法:通过关键字abstract 来实现,可以看做没有方法体的虚方法。
abstract class Phone { public abstract void displayInfo();//抽象方法 } class HuaweiPhone : Phone { public override void displayInfo() { Console.WriteLine("HuaweiPhone"); } } static void Main(string[] args) { Phone p1; HuaweiPhone p2 = new HuaweiPhone(); p2.displayInfo(); p1 = p2; p1.displayInfo(); } 输出结果 HuaweiPhone HuaweiPhone
3,密封方法:通过关键词sealed来实现,密封方法可以防止该方法被重载。
class Phone { public virtual void displayInfo() { Console.WriteLine("Phone"); } public virtual void call() { Console.WriteLine("Calling frome Phone"); } } class HuaweiPhone:Phone { sealed public override void displayInfo() //密封方法 { Console.WriteLine("HuaweiPhone"); } public override void call()//非密封的方法 { Console.WriteLine("Calling frome HuaweiPhoe"); } } class U8800pro : HuaweiPhone { /* public void override displayInfo() //此段会报错,因为密封类不能重写 { Console.WriteLine("U8800pro"); }*/ public override void call()//重写没有被密封的方法 { Console.WriteLine("Calling frome U8800pro"); } } class Program { static void Main(string[] args) { Phone p1=new Phone(); HuaweiPhone p2 = new HuaweiPhone(); U8800pro p3 = new U8800pro(); p1.displayInfo(); p2.displayInfo(); p3.displayInfo(); p1 = p3; p1.displayInfo(); p1.call(); } } 输出结果: Phone HuaweiPhone HuaweiPhone HuaweiPhone Calling frome U8800pro
4,方法的隐藏:通过关键词new来实现,继承类,可以改变继承自基类的方法。但被转换为基类时,会调用基类的方法。
class Phone { public void displayInfo() { Console.WriteLine("Phone"); } public virtual void call() { Console.WriteLine("Call Frome Phone"); } } class HuaweiPhone : Phone { public new void displayInfo() //隐藏方法,当转换为基类时,该方法不会被调用 { Console.WriteLine("HuaweiPhone"); } public override void call() { Console.WriteLine("Call Frome HuaweiPhone"); } } class Program { static void Main(string[] args) { Phone p1 = new Phone(); HuaweiPhone p2 = new HuaweiPhone(); p1.displayInfo(); p1.call(); p2.displayInfo(); p2.call(); p1 = p2; p1.displayInfo(); //将不会输出HuaweiPhone,实现了将方法隐藏 p1.call(); } } 输出结果 Phone Call Frome Phone HuaweiPhone Call Frome HuaweiPhone Phone Call Frome HuaweiPhone
5,抽象类:通过关键字abstract来实现,可以作为基类,但不能直接实例化。不能是密封类。
abstract class Phone { public abstract void displayInfo(); public void call() { Console.WriteLine("Call From Phone"); } } class HuaweiPhone:Phone { public override void displayInfo() { Console.WriteLine("HuaweiPhone"); } public new void call() { Console.WriteLine("Call From HuaweiPhone"); } } static void Main(string[] args) { HuaweiPhone p2 = new HuaweiPhone(); p2.displayInfo(); p2.call(); Phone p1 = p2; p1.displayInfo(); p1.call(); } 输出结果: HuaweiPhone Call From HuaweiPhone HuaweiPhone Call From Phone
6,密封类:通过关键词sealed来实现,目的是防止类被继承。
sealed class Phone { public void displayInfo(); public void call() { Console.WriteLine("Call From Phone"); } } class HuaweiPhone:Phone //此处编译出错,Phone不能被继承 { public override void displayInfo() { Console.WriteLine("HuaweiPhone"); } public new void call() { Console.WriteLine("Call From HuaweiPhone"); } }
总结:
相关文章推荐
- 新手菜鸟学习C#的笔记总结 之委托
- 新手菜鸟学习C#的笔记总结 之事件
- 新手菜鸟学习C#的笔记总结 之数组与集合(下)
- 新手菜鸟学习C#的笔记总结 之泛型
- 新手菜鸟学习C#的笔记总结 之数组与集合(上)
- 新手菜鸟学习C#的笔记总结 之接口
- selenium 学习笔记 ---新手学习记录(4) 问题总结(java)-autoit3脚本使用
- C# 学习总结 之 类 、接口、多态、重载
- selenium 学习笔记 ---新手学习记录(5) 问题总结(java)
- 【新手学习笔记】c#26字母和数字间的转换
- C# 学习总结 之 类 、接口、多态、重载
- 黑马程序员之c#程序学习笔记:c#程序经典例子学习总结
- [学习笔记]Asp.net(C#)菜鸟进级系列之值类型
- C#.NET学习笔记---C#中方法覆盖时override和new的比较,abstract和virtual的比较(含C#多态的实现)
- 新手C#协变和抗变学习总结
- selenium 学习笔记 ---新手学习记录(2) 问题总结
- 学习笔记(4):C#中的正则简单总结
- C#学习笔记之多态之虚方法
- android菜鸟学习笔记29----Android应用向用户发送提示信息的方式总结
- XML知识总结(C#和.NET2.0实战学习笔记)