关于基类中函数修饰符abstract和virtual的使用
2016-01-16 16:06
411 查看
关于基类中函数修饰符abstract和virtual的使用
版权所有,转载请注明文章出处 http://blog/csdn.net/cadenzasolo
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Computer.Qualifier { //关于基类中函数修饰符abstract和virtual的使用 class Program { static void Main(string[] args) { //V1 //Hint: The best way is just by sony or lenove//第一个版本V1我使用此方式 //V2 //开始为了写普通方法->简单工厂->工厂方法->抽象工厂->...... //竟然写着写着就写到多态了,多态和重载不是一个概念,重载是指同名函数的参数类型不同或者参数个数不同,与返回类型无关。 //而多态是指同名函数,不但参数类型和参数个数相同,还有返回类型也相同,只是函数的修饰符不同。 //最终决定调用基类还是子类,abstract/virtual/override/new要比上面的情况复杂。 //注释中的"//right"只是说在通常情况下使用最多的方式,“//bad”则反之。 //Hint: The best way is just by Dell or IBM//第二个版本V2,后面几篇文都是基于这个讲解,所以在这个版本我把修饰符换了 PC pc; //pc.Name = "NA PC"; //pc = new Dell(""); pc = new Dell("Dell"); pc.Name = "OtherDell"; pc.Describe(); System.Console.WriteLine(); pc = new IBM("IBM"); pc.Name = "OtherIBM"; pc.Describe(); System.Console.WriteLine(); pc = new HP("HP"); pc.Name = "OtherHP"; pc.Describe(); System.Console.WriteLine(); pc = new Sony("Sony"); pc.Name = "OtherSony"; pc.Describe(); System.Console.WriteLine(); pc = new Lenovo("Lenovo"); pc.Name = "OtherLenovo"; pc.Describe(); } } abstract class PC//:Brand { //注意这篇文章中这里使用了protected,和后面文章中的改用成private有很大的不同 protected string name; //public PC(string name){ } //bad, sub-class need tranfer this.name=name public PC(string name) //right, sub-calss needn't tranfer this.name=name { //this.name = "unknown"; this.name = name; //this.name = !string.IsNullOrEmpty(name) ? name : "unknown"; } //The super-class property(Name{get;set;}) don't use abstract,otherwise the sub-class(Dell/IBM/...) must implement Name{get;set;} //public abstract string Name { get; set; } //bad public virtual string Name { get; set; } //right //public abstract void Describe(); //right public virtual void Describe() { System.Console.WriteLine("I am {0} personal computer of super-calss", name); } //bad } class Dell : PC { public Dell(string name) : base(name) { //this.name = name; //no use tranfer } public override void Describe() { System.Console.WriteLine("I am {0} personal computer", name); System.Console.WriteLine("I am {0} personal computer", Name); } } class IBM : PC { protected new string name; //No, or have to use it(要么不用,要么必须这样用),此处的成员变量(name)只能这样new基类同名成员变量 //the qualifier(override/new) don't use new, otherwise will call super-class public override string Name { get; set; } //right, use override, it's call sub-class public IBM(string name) : base(name) { this.name = name; } public override void Describe() //right, use override, it's call sub-class { System.Console.WriteLine("I am {0} personal computer", name); System.Console.WriteLine("I am {0} personal computer", Name); } } class HP : PC { protected new string name; public override string Name { get; set; } //right public HP(string name) : base(name) { this.name = name; } public new void Describe() //bad { System.Console.WriteLine("I am {0} personal computer", name); System.Console.WriteLine("I am {0} personal computer", Name); } } class Sony : PC { protected new string name; public new string Name { get; set; } //bad public Sony(string name) : base(name) { this.name = name; } public override void Describe() //right { System.Console.WriteLine("I am {0} personal computer", name); System.Console.WriteLine("I am {0} personal computer", Name); } } class Lenovo : PC { protected new string name; public new string Name { get; set; } //bad public Lenovo(string name) : base(name) { this.name = name; } public new void Describe() //bad { System.Console.WriteLine("I am {0} personal computer", name); System.Console.WriteLine("I am {0} personal computer", Name); } } }
版权所有,转载请注明文章出处 http://blog/csdn.net/cadenzasolo
相关文章推荐
- c#调用COM组件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法
- C#中Equality和Identity浅析
- C#比较二个数组并找出相同或不同元素的方法
- C#生成饼形图及添加文字说明实例代码
- C#判等对象是否相等的方法汇总
- RabbitMQ入门与使用篇 推荐