C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-
1.属性
//属性的2种写法 public class person { private string _name; public string Name { get { return _name; } set { _name=value; } } public int Age { get; set; } }
2.索引器
//外部调用 person p=new person; sting str=p[] public class person { private string _name; public string Name { get { return _name; } set { _name=value; } } public int Age { get; set; } public string Email { get; set; } //也可以用 sting 键值,也可以多个参数 //可以重载,PS:public string this[int index],public string this[string key] public string this[int index] { get { string result=""; switch(index) { : result=this.Name; break; : result=this.Age; break; : result=this.Email; break; } return result; } } }
3.方法重写/重载
方法重写(子类重写父类)
父类中的方法子类要想重写需要将父类方法标记为virtual
子类重写父类方法时,使用的关键字override
方法重载(一个类中的多个重名的方法)
4.多态
①里氏替换原则
//需要一个父类类型对象,可以赋值一个子类类型对象,叫做"里氏替换",反过来不成立! Person p = new Chinese(); public class Person { } public class Chinese:Person { }
②多态
实现多态的方法
方法1虚方法virtual子类重写父类中的方法
方法2 抽象类abstract 子类重写父类中的方法
方法3 接口 实现接口的类,将接口中的方法实现
方法1虚方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _10通过继承实现多态 { class Program { static void Main(string[] args) { Chinese cn1 = new Chinese("中国人"); Person[] pers = { cn1 }; ; i < pers.Length; i++) { //实现了多态 pers[i].ShowNationality(); } Console.ReadKey(); } } public class Person { public string Name { get; set; } public int Age { get; set; } public string Email { get; set; } //父类中的方法子类要想重写需要将父类方法标记为virtual. //虚方法,子类可以重写也可以不重写。 public virtual void ShowNationality() { Console.WriteLine("......"); } public override string ToString() { return this.Name; } } public class Chinese : Person { public Chinese(string name) { this.Name = name; } public string HuKou { get; set; } public void Say() { Console.WriteLine("我是中国人."); } //子类重写父类方法时,使用的关键字是override public override void ShowNationality() { Console.WriteLine("【中国】"); } } }
方法2抽象
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _15通过抽象类来实现多态2 { class Program { static void Main(string[] args) { Person p = new Japanese(); p.Name = "mamm"; p.Say(); Console.WriteLine(p.Name); Console.ReadKey(); } } //抽象类的特点: //1.抽象类不能被实例化。 //2.抽象类中可以有实例成员,也可以有抽象成员。 public abstract class Person { public abstract string Name { get; set; } public int Age { get; set; } public string Email { get; set; } //1.将virtual关键字变为abstract。 //2.抽象成员不能有任何实现代码 //3.抽象成员只能出现在抽象类中。所以要把当前类也标记为abstract //4.与虚方法不同,抽象方法子类必须重写(除非子类也是抽象类) public abstract void Say(); } public class Chinese : Person { public override void Say() { Console.WriteLine("Chinese中的Say"); } public override string Name { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } } public class Japanese : Person { public override void Say() { Console.WriteLine("Japanese中的Say方法。"); } public override string Name { get { return "aaa"; } set { } } } }
方法3.接口
//1.接口中只能包含方法(属性、事件、索引器也都是方法)
//2.接口中的成员都不能有任何实现。
//3.接口不能被实例化。
//4.接口中的成员不能有任何访问修饰符。(默认为public)
//5.实现接口的子类必须将接口中的所有成员全都实现。
//6.子类实现接口的方法时,不需要任何关键字,直接实现即可。
//7.接口存在的意义就是为了多态。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _05接口1 { class Program { static void Main(string[] args) { //1.接口解决了多继承的问题。(抽象类不行。) //2.当不同类型要实现多态时,无法抽象出公共的父类,这时可以考虑使用接口(比如:鸟和飞机都能飞,但是无法抽象出共同的父类。) IShow ren = new Japanese();//new Chinese(); ren.Show(); Console.ReadKey(); } } public class Person { public string Name { get; set; } public int Age { get; set; } public string Email { get; set; } } public interface IShow { //显示国籍。 void Show(); } public class Chinese : Person, IShow { #region IShow 成员 public void Show() { Console.WriteLine("中国"); } #endregion } public class Japanese : Person, IShow { #region IShow 成员 public void Show() { Console.WriteLine("日本"); } #endregion } } public interface ISupperMan { // 1.接口里面只能包含方法(事件、属性、索引器) //2.接口中的成员不能有访问修饰符默认是public void Fly(); void Fight(); } //实现接口的类必须把接口中的所有成员都实现。 public class Person : ISupperMan { public string Name { get; set; } public int Age { get; set; } public string Email { get; set; } #region ISupperMan 成员 public void Fly() { } public void Fight() { } #endregion }
C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-的更多相关文章
- CLR via C#(11)-无参属性、有参数属性(索引器)
一. 无参属性 1. 定义属性 无参属性就是我们最常见的属性方式,在赋值时可以加入一定的逻辑判断.属性的定义其实不复杂,先看个直观的例子: 说明: 属性要定义名称和类型,且类型不能是void. 属性是 ...
- C#通过完整的例子,Get常用的2个套路,理解抽象方法,虚方法,接口,事件
一.理解:抽象方法,虚方法,接口,事件 描述: 1.定义一个抽象父类"People": 要求: 1>3个属性:名字,性别,年龄: 2>一个普通方法"说话&qu ...
- LindAgile~缓存拦截器支持类的虚方法了
写它的原因 之前写过一个缓存拦截器,主要在方法上添加CachingAspect特性之后,它的返回值就可以被缓存下来,下次访问时直接从缓存中返回结果,而它有一个前提,就是你的方法需要是一个接口方法,缓存 ...
- C#多态--虚方法实现多态
1.虚方法提供一种默认实现,子类可以选择是否重写,如果不重写,那么就使用父类已经实现的方法.(重写可以改变方法的指针) 如果需要改变类型指针,那么需要做方法的重写: 1.如果子类方法是重写方法,那么系 ...
- c# 多态 虚方法
多态: 为了解决同一种指令,可以有不同行为和结果 在运行时,可以通过调用同一个方法,来实现派生类中不同表现. 虚方法——抽象类——抽象函数——接口 虚方法: 被virtual 关键字修饰的方法 叫做 ...
- C# 虚方法 抽象方法 接口
虚方法:virtu 注意的几点: 1,父类中如果有方法让子类重写,则可以将该方法标记为virtual 2.虚方法在父类中必须有实现,哪怕是空实现 3虚方法子类可以重写,也可以不重写 4.如果类是抽象类 ...
- C#中的抽象方法,虚方法,接口之间的对比
1.首先来看一看抽象类 抽象类是特殊的类,不能够被实例化:具有类的其他特性:抽象方法只能声明于抽象类中,且不包含任何实现 (就是不能有方法体),派生类也就是子类必须对其进行重写.另外,抽象类可以派生自 ...
- 浅谈C#抽象方法、虚方法、接口
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...
- Java 多态 虚方法
Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载. 看代码: package com.company; public class Main { public stati ...
随机推荐
- iOS Xcode 打包之后,不能输出日志
现象:一个项目,之前做的好好的,后来打包,生成ipa文件之后, 再运行的时候,NSLog的日志都不输出了. 解决方案: 在模式选择里面,里面包含:“Debug”.“Release”两种,设置“Debu ...
- 你的USB设备还安全吗?USB的安全性已从根本上被打破!
前言: USB设备使用方便,但也可能被用来携带恶意软件.病毒,感染计算机系统.通过禁用自动播放功能.杀毒软件查杀.不定期的对设备进行格式化等操作可以确保它是干净的.但它存在的安全问题要比我们想象的更深 ...
- 网站已迁移至:https://tasaid.com/
个人网站:http://tasaid.com/ 主要文章在 个人网站 更新,尽可能在博客园同步更新. github:https://github.com/linkFly6 或者可以参与到我目前正在开发 ...
- iOS证书和描述文件
iOS有两种证书和描述文件: 证书类型 使用场景 开发(Development)证书和描述文件 用于开发测试,在HBuilder中打包后可在真机环境通过Safari调试 发布(Distribution ...
- 点击ViewGroup时其子控件也变成pressed状态的原因分析及解决办法
这个问题,当初在分析touch事件处理的时候按理应该分析到的,可是由于我当时觉得这块代码和touch的主题不是那么紧密, 就这么忽略掉了,直到后来在这上面遇到了问题.其实这个现象做Android开发的 ...
- TextInputLayout setError() setErrorEnable()
public void afterTextChanged(Editable s) { if (textInputLayout.getEditText().getText().toString().le ...
- yii2下拉框带搜索功能
简单的小功能,但是用起来还是蛮爽的.分享出来让更多的人有更快的开发效率,开开心心快乐编程.作者:白狼 出处:http://www.manks.top/yii2_dropdown_search.html ...
- C#实现在图片上斜着写字
最近公司要搞微信活动页面,要实现图片上可以写自己名字的功能,于是就查了一下怎么实现,下面贴一下代码备忘,希望大家也能用到: 我是在控制台应用程序里进行试验的. using (Image bitmap ...
- window.frameElement的使用
window.frameElement的使用: 返回嵌入当前window对象的元素(比如 <iframe> 或者 <object>),如果当前window对象已经是顶层窗口,则 ...
- springMVC 拦截器如何做登录检查及页面跳转
一个非常简单的登录权限拦截器 问题一:登录页面的提交请求肯定是要过滤掉的,目前采用在xml里配置<mvc:mapping path="/supplier/*"/>来过滤 ...