.Net学习 第2季07 C#面向对象 多态
2014-12-08 17:04
260 查看
.Net视频学习第2季C#面向对象
面向对象多态
概念:让一个(父类)对象表现出多种(子类)类型的特性;三种方法:虚方法/抽象类/接口
方法一:虚方法
将父类方法标记为虚方法,使用关键字virtual在返回值类型前,这个方法可以被子类重写一遍(在子类方法返回值类型前使用关键字override)
没有使用虚方法下:
创建Person[]数组,将Chinese和Japanese的对象放进去(里氏转换),再遍历数组成员调用其SayHello()方法,将全部得到Iamaperson,因为尽管放进去的是Chinese和Japanses的对象,但是数组本身是Person数组,所以成员会被解释成Person类型的对象,从而只能调用父类Person的SayHello()方法。要想得到子类的方法调用,需要进行强制类型转换。
通过上述的虚方法,在数组中不需要进行强制转换,Chinese/Japanese的对象会调用各自子类中的SayHello()。
实质:调用的依然是父类的方法,但是该方法已被子类重写,至于选择哪个子类的重写版本,取决于该父类对象装的是哪个子类对象(如果没有装子类对象,就是父类对象本身,则会调用父类方法)
方法二:抽象类
当父类的方法不确定如何实现的时候,可以选择将父类写成抽象类,同时父类方法写为抽象方法,使用关键字abstract,注意抽象方法不允许有方法体(就是说没有那一对大括号)
---父类方法有默认实现,并且父类需要实例化,用虚方法
---父类方法没有默认实现,并且父类不需要实例化,用抽象类
抽象类无法创建对象。但子类的对象调用方法时时调用父类的抽象方法(只不过内容被自己子类的方法重写了)
注意抽象类中可以有非抽象成员(虽然父类无法调用---因为父类无法实例化,但这些成员依然会被子类继承),子类需要重载父类所有的抽象成员(除非子类本身也是一个抽象类),属性本质上是两个方法,所以也需要重载。快速重载所有抽象成员的快捷键是alt+shift+F10(和快速导入类的命名空间一样,类的左下角有蓝色方框即可使用此快捷键)
面向对象多态
概念:让一个(父类)对象表现出多种(子类)类型的特性;三种方法:虚方法/抽象类/接口
方法一:虚方法
将父类方法标记为虚方法,使用关键字virtual在返回值类型前,这个方法可以被子类重写一遍(在子类方法返回值类型前使用关键字override)
没有使用虚方法下:
publicclassPerson { privatestring_name; publicstringName { get{return_name;} set{_name=value;} } publicPerson(stringname) { this.Name=name; } publicvoidSayHello() { Console.WriteLine("Iamaperson"); } }
publicclassChinese:Person { publicChinese(stringname):base(name) { } publicvoidSayHello() { Console.WriteLine("IamChinese"); } }
publicclassJapanese:Person { publicJapanese(stringname):base(name) { } publicvoidSayHello() { Console.WriteLine("IamJapanese"); } }
创建Person[]数组,将Chinese和Japanese的对象放进去(里氏转换),再遍历数组成员调用其SayHello()方法,将全部得到Iamaperson,因为尽管放进去的是Chinese和Japanses的对象,但是数组本身是Person数组,所以成员会被解释成Person类型的对象,从而只能调用父类Person的SayHello()方法。要想得到子类的方法调用,需要进行强制类型转换。
Person { ... publicvirtualvoidSayHello(){} } Chinese:Person { .... publicoverridevoidSayHello(){} } Japanese:Person { .... publicoverridevoidSayHello(){} }
通过上述的虚方法,在数组中不需要进行强制转换,Chinese/Japanese的对象会调用各自子类中的SayHello()。
实质:调用的依然是父类的方法,但是该方法已被子类重写,至于选择哪个子类的重写版本,取决于该父类对象装的是哪个子类对象(如果没有装子类对象,就是父类对象本身,则会调用父类方法)
方法二:抽象类
当父类的方法不确定如何实现的时候,可以选择将父类写成抽象类,同时父类方法写为抽象方法,使用关键字abstract,注意抽象方法不允许有方法体(就是说没有那一对大括号)
---父类方法有默认实现,并且父类需要实例化,用虚方法
---父类方法没有默认实现,并且父类不需要实例化,用抽象类
publicabstractclassAnimal { publicabstractvoidBark(); } publicclassDog:Animal { publicoverridevoidBark() { Console.WriteLine("XXXX"); } }
publicclassCat:Animal { publicoverridevoidBark() { Console.WriteLine("YYYY"); } }
抽象类无法创建对象。但子类的对象调用方法时时调用父类的抽象方法(只不过内容被自己子类的方法重写了)
注意抽象类中可以有非抽象成员(虽然父类无法调用---因为父类无法实例化,但这些成员依然会被子类继承),子类需要重载父类所有的抽象成员(除非子类本身也是一个抽象类),属性本质上是两个方法,所以也需要重载。快速重载所有抽象成员的快捷键是alt+shift+F10(和快速导入类的命名空间一样,类的左下角有蓝色方框即可使用此快捷键)
相关文章推荐
- .Net学习 第2季08 C#面向对象 访问修饰符 序列化/反序列化 部分类 密封类
- .Net学习 第2季03 C#面向对象 继承
- .Net学习 第2季01 C#面向对象 基础
- .Net学习 第2季05 C#面向对象 ArrayList Hashtable List<> Dictionary<>
- .Net学习 第2季04 C#面向对象 里氏转换 is/as操作 随机数 protected
- .Net学习 第2季06 C#面向对象 Path类 File类 FileStream类 StreamReader/StreamWriter类
- (13)Java学习笔记——面向对象07——多态
- .Net学习难点讨论系列2 – 细说C#中new关键字与多态
- .Net学习笔记----2015-07-22(C#基础复习10,面向对象2个小练习)
- .net学习之C#基础提高 07变量交换__输入
- C#学习进程-面向对象-多态
- .Net(一):再识面向对象之C#学习总结
- .Net学习笔记----2015-07-21(C#基础复习07,关键字、访问修饰符)
- .net学习之C#面向对象 A2.对象的引用
- .net学习之C#面向对象 A1.面向对象
- .Net学习 第2季09 C#面向对象 接口 Guid
- .Net学习难点讨论系列2 – 细说C#中new关键字与多态
- 我想把我的生活感悟写入面向对象C#、写入.net,写入Web里.(本人的文化水平有限,请见谅~~) ­
- C# 学习总结 之 类 、接口、多态、重载
- 因工作需要,从0开始学习.NET,以C#为主,有兴趣的可以慢慢看