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 ...
随机推荐
- SuperMap iClient 7C——网络客户端GIS开发平台 产品新特性
SuperMap iClient 7C是空间信息和服务的可视化交互开发平台,是SuperMap服务器系列产品的统一客户端.产品基于统一的架构体系,面向Web端和移动端提供了多种类型的SDK开发包,帮助 ...
- 关于UIScollView 中的contentOffset 的理解
大家对UIScollView 中的contentOffset 一直有疑问, 虽然看是一个简单的问题, 实际上并不简单. 当时我也有好多疑问, 后来在网上找了一下资料, 发现没有找到合理的解释, 因此自 ...
- js 随机生成姓名、手机号、身份证号、银行卡号
开发测试的时候,经常需要填写姓名.手机号.身份证号.银行卡号,既要符合格式要求.又不能重复.大家会到网上搜各种生成器.能不能自己写一个简单的生成器呢.下面是随机生成姓名.手机号.身份证号.银行卡号的j ...
- Android:开发环境搭建相关问题
1.Android.ADT.SDK概念与关系 SDK:Software Development Kit,中文意思是“软件开发工具包”.这是一个覆盖面相当广泛的名词,可以这么说:辅助开发某一类软件的相关 ...
- FindBugs 入门——帮你减少代码中的bug数
FindBugs 入门 FindBugs 作用 开发人员在开发了一部分代码后,可以使用FindBugs进行代码缺陷的检查.提高代码的质量,同时也可以减少测试人员给你报的bug数. 代码缺陷分类 根据缺 ...
- (转载)SQL Reporting Services (Expression Examples)
https://msdn.microsoft.com/en-us/library/ms157328(v=SQL.100).aspx Expressions are used frequently in ...
- 设计模式C#实现(十五)——命令模式
意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 将请求封装成一个对象,客户接受请求参数:可以对请求排队或者记录请求日志,以及可以支持撤销操作 适用性 抽象出待执行的动作以参数化某对 ...
- android 尽量不要使用static静态变量
使用静态static静态变量潜在性问题: 1.占用内存,并且内存一般不会释放: 2.在系统不够内存情况下会自动回收静态内存,这样就会引起访问全局静态错误. 3.不能将activity作为static静 ...
- Windows10 会不会成为微软的新起点?
Because if you change the way you see the world, you can change the world you see. 如果你改变看世界的方式,你就能改变 ...
- Neutron 理解 (4): Neutron OVS OpenFlow 流表 和 L2 Population [Netruon OVS OpenFlow tables + L2 Population]
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...