c#重点[封装,继承,多肽]
面向对象的语言三大特点:封装、继承、多态
Ⅰ.封装:是把类的内部隐藏起来,以防止外部世界看见的一个面向对象的概念,通过关键字去控制变量,方法的访问权限。
1).访问修饰符:
Ⅱ.继承:
eg:我们建一个Person作为父类,Chinese作为子类
class Person
{
public string name="zhangsan";
public int age=;
//类里面有一个默认的构造方法,我们在下面写了一个构造方法,如果想去调用这个无参数的构造方法,那就要加一个无参构造方法
public Person()
{
Console.WriteLine("我是一个人类");
}
public void SayHi()
{
Console.WriteLine("hello,我是人类!");
}
}
Person
class Chinese:Person
{ }
Chinese
我们在程序入口里面调用父类里面的成员:
class Program
{
static void Main(string[] args)
{
Chinese c = new Chinese();
Console.WriteLine(c.name);
Console.WriteLine(c.age);
c.SayHi();
}
}
Program
得到结果为:
1.为什么子类里面没有成员,还能调用?
如果,我把person里面的 [public string name="zhangsan";]变为私有成员[private string name;],调用结果显示?
以上的得出结论:
继承:
1.单继承,一个类只能继承一个类[一个儿子只有一个爹]
2.Chinese:Person Chinese 子类/派生类 Person 父类/基类/超类
3.Chinese:Person 那么Chinese继承了Person里面所有的成员(字段、方法),对于父类的私有成员,子类还是能继承到,只是没有访问权限
2).所有的类型的基类是System.Object类
3) . 构造函数不能被继承
4).子类Chinese里面添加一个方法
class Chinese:Person
{
public Chinese()
{
Console.WriteLine("我是中国人!");
}
}
Chinese
我们调用program看一下结果:
class Program
{
static void Main(string[] args)
{
Chinese c = new Chinese();
c.SayHi();
}
}
Program
结果显示:
4.当实例化子类对象时,首先调用父类的构造方法,然后调用子类的构造方法。
5).人类属于动物类animal,我们创建一个animal类让rerson类继承。chinese继承person,person继承animal
class Animal
{
public Animal()
{
Console.WriteLine("我是动物类!");
}
}
Animal
class Person:Animal
{
public Person()
{
Console.WriteLine("我是人类");
}
public void SayHi()
{
Console.WriteLine("hello,我是人类!");
}
Person:Anima
class Chinese:Person
{
public Chinese()
{
Console.WriteLine("我是中国人!");
}
}
Chinese:Person
结果显示:
5.如果A:B,B:C,那么A:C;
6).父类Person里面有一个SayHi()方法,如果在子类里面添加一个sayHi方法
class Chinese:Person
{
public Chinese()
{
Console.WriteLine("我是中国人!");
}
public void SayHi()
{
Console.WriteLine("你好,我是中国人");
}
}
Chinese里添加一个SayHi方法
结果显示:
我们来谈一下过程:
ⅰ.继承过来之后被隐藏,有意隐藏加一个关键字"new",如果加了关键字"new",就告诉子类,父类里面的sayHi只能被隐藏,不能被覆写
ⅱ.继承过来之后被覆写/重写,覆写需要在父类里面加"virtual",加了"virtual"之后就告诉子类继承之后,子类只能覆写"override"
结果还是一样,结论显示:
6.一个子类和父类有相同的方法时,当运用子类的对象去调用该方法时,调用子类的方法,默认情况下,从父类的方法被隐藏掉,(有意隐藏,需要在子类的方法上加上New(可以加也可以不加))
如果想覆写/重写父类的方法,需要在父类里面设置该方法为虚方法(virtual),然后子类通过override关键字去覆写。
7).里氏替换原则:一个父类的变量可以接收子类的对象,反之不行。
class Person:Animal
{
public Person()
{
Console.WriteLine("我是人类");
}
public void SayHi()
{
Console.WriteLine("hello,我是人类!");
}
}
Person
class Chinese:Person
{
public Chinese()
{
Console.WriteLine("我是中国人!");
}
public void SayHi()
{
Console.WriteLine("你好,我是中国人");
}
}
Chinese:Person
class Program
{
static void Main(string[] args)
{
//父类的变量可以接收到子类的任何类型
//如果没有覆写的话,就近原则,p离person近,就调用person的sayHi方法
Person p = new Chinese();
p.SayHi();
Console.ReadKey();
}
}
Program
结果:
覆写之后:
class Person:Animal
{
public Person()
{
Console.WriteLine("我是人类");
}
public virtual void SayHi()
{
Console.WriteLine("hello,我是人类!");
}
}
Person
class Chinese:Person
{
public Chinese()
{
Console.WriteLine("我是中国人!");
}
public override void SayHi()
{
Console.WriteLine("你好,我是中国人");
}
}
Chinese
结果:
得出:
7.子类和父类有相同的方法,默认情况下(没有被覆写),该变量调用该方法时,调用的是父类的方法(就近原则);
当子类覆写该方法时,变量调用的是子类的方法。
8) .密封类 sealed class,不能被继承的类
9).继承的好处?
假设工厂要生产三孔的插座,它首先会把模型设计出来,模型里面只是定义了方法,模型没有写方法的具体内容,把公共的方法抽象出来,做程序的时候先写了一个接口,
让下面的类继承这个接口,这个接口并不实现具体的内容,只是定义方法名,返回的类型,具体实现什么效果是在子类里面override,所以继承的好处就是把公共的东西抽象出 来,减少了代码的重复性。
Ⅲ.多态 方法名相同,方法具体实现内容不同
1. 多态分为重载(overload)和覆写(override)
重载:方法名相同,方法里面的参数不同,参数的种类,个数或者顺序不同。
2. 只有父类的虚方法(virtual)才能被子类覆写,子类实现覆写用关键字override,如果不加override就隐藏了父类的方法(需要加上关键字new,eg: public new static void Chinese())
3. 静态方法不能被覆写,但可以被隐藏
4. 静态类里面只能有静态成员
5. 静态的成员不能带override ,virtual ,abstract
c#重点[封装,继承,多肽]的更多相关文章
- day33 序列类型,绑定方法,类方法,静态方法,封装继承和多态
Python之路,Day20 = 序列类型,绑定方法,类方法,静态方法,封装继承和多态 序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主要 ...
- java面向对象(封装-继承-多态)
框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...
- objective-c自学总结(三)---面向对象的封装,继承与多态
面向对象的三大特性 封装 继承 多态 1.封装: 隐藏属性,方法或实现细节的过程称为封装 信息隐藏,隐藏对象的实现细节,不允许用户看到 将东西包装在一 然后以新的完整形式呈现出来 例如,两种或多种化学 ...
- 浅谈学习C++时用到的【封装继承多态】三个概念
封装继承多态这三个概念不是C++特有的,而是所有OOP具有的特性. 由于C++语言支持这三个特性,所以学习C++时不可避免的要理解这些概念. 而在大部分C++教材中这些概念是作为铺垫,接下来就花大部分 ...
- Java三大特性(封装,继承,多态)
Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...
- php面向对象 封装继承多态 接口、重载、抽象类、最终类总结
1.面向对象 封装继承多态 接口.重载.抽象类.最终类 面向对象 封装继承多态 首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...
- PHP面向对象 实例化 构造函数 封装 继承 静态
PHP面向对象 实例化 构造函数 封装 继承 静态 面向对象: 一:定义类 class Dog { var $name; var $age; var $pinzhong; function Jiao( ...
- Java基础——面向对象(封装——继承——多态 )
对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...
- Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)
Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...
- OOP三大核心封装继承多态
OOP支柱 3 个核心:封装 继承 多态 封装就是将实现细节隐藏起来,也起到了数据保护的作用. 继承就是基于已有类来创建新类可以继承基类的核心功能. 在继承中 另外一种代码重用是:包含/委托,这种重用 ...
随机推荐
- 定时关闭AWS上的EC2机器实例
最近一段时间在做一个产品从阿里云向亚马逊云中国区迁移的前期试验.亚马逊中国区并没有开放免费体验账号,使用的每一份资源都要实打实的掏钱.而为了实验我们使用时一般要启动好几台EC2实例.为了不浪费辛辛苦苦 ...
- Qt5.3编译错误——call of overloaded ‘max(int int)’is ambiguous
错误描述: 今天在使用Qt写一个C++函数模板的测试程序的时候,编译的时候,编译的时候出现如下错误: 错误描述为:在main函数中,进行函数max()重载时,出现(ambiguous)含糊的,不明确的 ...
- Redis中统计各种数据大小的方法
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/125.html?1455853369如果 MySQL 数据库比较大的话,我 ...
- Js~对数组进行分组户数
在sql里有group by,主要对数据结果集进行分组统计,而对于JS来说,有时我们也需要这种功能,例如一个数据{"dog","cat","dog&q ...
- Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念
PO(persistant object) 持久对象 在 o/r 映射的时候出现的概念,如果没有 o/r 映射,没有这个概念存在了.通常对应数据模型 ( 数据库 ), 本身还有部分业务逻辑的处理.可以 ...
- HashMap和Hashtable的区别 源码分析
一:以前只知道HashMap和HashTable区别,死记硬背的记住HashMap 允许key value为空 而Hashtable 不允许为空 HashMap线程是非线程安全的,而Hashtable ...
- android sdk下载
android sdk下载 所有的离线包都有 http://mirrors.neusoft.edu.cn/android/repository/
- Unity 产生各不相同的随机数
1. 网上很多方法都说用时间种子来解决,但是在极短的时间内,这种方法没效 Random r = new Random(DateTime.Now.Millisecond); Random Counter ...
- Python函数参数默认值的陷阱和原理深究"
本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害,以及其实现原理和设计目的 本博客已经迁移至: http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...
- FlashFXP(强大的FXP/ftp上传工具)V5.0.0.3722简体中文特别版
flashfxp是功能强大的fxp/ftp软件,融合了一些其他优秀ftp软件的优点,如像cuteftp一样可以比较文件夹, FlashFXP是一款功能强大的FXP/ftp上传工具, FlashFXP集 ...