对C#面向对象三大特性的一点总结
一、三大特性
封装: 把客观事物封装成类,并把类内部的实现隐藏,以保证数据的完整性
继承:通过继承可以复用父类的代码
多态:允许将子对象赋值给父对象的一种能力
二、【封装】特性
把类内部的数据隐藏,不让对象实例直接对其操作,通过给类及类中的成员变量、属性和方法设置不同的访问修饰符(public、protected、internal、
protected internal、private)来控制它们的作用范围,以达到封装的目的。
实例:
(1) 没有封装的类:
public class Animal
{
public string _name;
public int _age;
}
static void Main(string[] args)
{
Animal animal = new Animal();
animal._name = "sheep";
animal._age = -;
}
(2) 封装后的类:
public class Animal
{
private string _name;
private int _age; public string Name
{
get { return _name; }
set { _name = value; }
} public int Age
{
get { return _age; }
set
{
if (value < || value > )
{
throw (new AggregateException("年龄必须在0~10岁之间!"));
}
_age = value;
}
}
}
二、【继承】特性
1、通过继承,程序可实现对父类代码的复用,子类继承父类的所有成员(构造函数 、析构函数、静态类、密封类除外),子类无需再定义父类中已有定义的代码。
2、被继承的类成为父类、基类、超类,而主动继承的类成为子类或派生类,Object是所有类的基类。
3、当父类和子类中有名称相同的方法时,父类中的方法会被隐藏
4、里氏替换原则:子类对象可以赋值给父类变量,反之不成立
5、子类不能对父类的私有成员进行访问,只能对公有成员和保护成员访问,但子类可以通过调用公有成员或保护方法间接的对私有成员进行访问
实例:
//基类:Animal
public class Animal
{
private string _name;
private int _age; public string Name
{
get { return _name; }
set { _name = value; }
} public int Age
{
get { return _age; }
set
{
if (value < || value > )
{
throw (new AggregateException("年龄必须在0~10岁之间!"));
}
_age = value;
}
}
} //子类:羊
public class Sheep : Animal
{ } //子类:马
public class Horse : Animal
{ } static void Main(string[] args)
{
Sheep sheep = new Sheep();
sheep.Name = "Xi Yangyang";
sheep.Age = ; Horse horse = new Horse();
horse.Name = "Qian Li";
horse.Age = ;
}
三、【多态】特性
1、相同类型的对象调用相同的方法表现出不同的行为。
2、两种表现形式:重载、重写
3、重载:同一个类中有多个方法的名称相同、参数个数不同或类型不同
4、重写:使用 virtua l和 override 关键字实现方法重写,只有基类成员声明为virtual 或 abstract,才能被派生类重写。
5、以下3种情况重写:
a、当类为普通类时,只有父类的虚方法才能被子类重写,子类实现重写要用关键字override,如果不加override就会隐藏父类的方法,
隐藏需要加上关键字new,例如:
public new static void a()
{
}
或
public static new void a()
{
}
静态类中只能有静态成员,非静态类中可以有静态成员和非静态成员。
静态方法不能被重写,但可以被隐藏。
静态成员不能带override、abstract、virtual。
b、抽象类中可以有抽象属性、抽象方法和成员实例,继承抽象类的子类必须直接或间接重写所有的抽象方法,而且参数和返回值类型必须完全一致,
成员实例可以不被重写。
非抽象类中只能有成员实例。
抽象类不能直接实例化,但是有构造方法,可以利用里氏替换原则把子类对象赋值给抽象的父类变量。
抽象方法必须用abstract修饰,而且不能有方法体。
抽象方法不能用private修饰。
c、类是单继承,接口是多继承,如果同时继承类和接口的话,接口必须在基类的后面,否则编译会出错。
接口不能直接实例化,没有构造方法,可以利用里氏替换原则把子类对象赋值给接口类型的父类变量。
接口中的成员没有访问修饰符,默认是public类型的,而且不能手动添加任何访问修饰符。
实现接口时不需要override,实现接口的类中的方法的参数和返回值类型必须与接口中定义的类型完全一致。
接口命名一般以I开头,表示某种功能,实现某一接口表示具备了某一功能。
6、使用sealed关键字阻止派生类重写基类虚成员。
7、使用New关键字隐藏基类成员:当子类中需要添加的方法与基类中的方法名相同,使用new关键字隐藏基类方法,但如果想要强制访问基类方法,
则可使用强制类型转换,把子类强制转换成基类类型,例如:
//基类:Animal
public class Animal
{
private string _name;
private int _age; public string Name
{
get { return _name; }
set { _name = value; }
} public int Age
{
get { return _age; }
set
{
if (value < || value > )
{
throw (new AggregateException("年龄必须在0~10岁之间!"));
}
_age = value;
}
} public void Eat()
{
Console.WriteLine("动物的吃方法");
}
} //子类:羊
public class Sheep : Animal
{
public new void Eat()
{
Console.WriteLine("羊的吃方法");
}
} static void Main(string[] args)
{
Sheep sheep = new Sheep();
sheep.Name = "Xi Yangyang";
sheep.Age = ;
sheep.Eat();
((Animal)sheep).Eat(); //子类强制转换成基类方法 Horse horse = new Horse();
horse.Name = "Qian Li";
horse.Age = ; Console.Read();
}
对C#面向对象三大特性的一点总结的更多相关文章
- [.net 面向对象编程基础] (12) 面向对象三大特性——继承
[.net 面向对象编程基础] (12) 面向对象三大特性——继承 上节我们说了面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低 ...
- [.net 面向对象编程基础] (11) 面向对象三大特性——封装
[.net 面向对象编程基础] (11) 面向对象三大特性——封装 我们的课题是面向对象编程,前面主要介绍了面向对象的基础知识,而从这里开始才是面向对象的核心部分,即 面向对象的三大特性:封装.继承. ...
- [.net 面向对象编程基础] (13) 面向对象三大特性——多态
[.net 面向对象编程基础] (13) 面向对象三大特性——多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...
- 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍
面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...
- C++面向对象三大特性
面向对象三大特性 继承 public protected private public继承 public protected 不可见 private继承 private private 不可见 pro ...
- JAVA基础——面向对象三大特性:封装、继承、多态
JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据. ...
- day20面向对象三大特性 , 类嵌套
#!/usr/bin/env python# -*- coding:utf-8 -*- # 1.简述面向对象三大特性并用代码表示."""封装:class Account: ...
- python 面向对象(三大特性)
python 面向对象(初级) (思维导图 ↑↑↑↑↑) 概述: 面向过程:根据业务逻辑从上到下垒代码. 函数式:将某功能代码封装至函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类 ...
- python 面向对象三大特性(封装 多态 继承)
今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面 ...
随机推荐
- 在MATLAB R2018b中配置VLFeat
在MATLAB R2018b中配置VLFeat 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ VLFeat官网:http://www.vlfeat.o ...
- leetcode - 01
只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: ...
- 2019牛客多校第八场A All-one Matrices 悬线法,单调栈待补
All-one Matrices 题意 对于一个n,m的01矩阵,问有多少个极大矩阵. 分析 对于悬线法来说,其过程就是枚举极大矩阵的过程,那如何计数呢?对于一个点来说,若其左右边界包含了上一个点的悬 ...
- jeecgboot数据字典使用
jeecgboot数据字典使用 input页面下拉框使用 效果展示 实现 定义数据字典 引用并调用JDictSelectTag组件 import JDictSelectTag from '@/comp ...
- eclipse unable to start within 45 seconds
在eclipse4.8.2中运行tomcat8.5项目时,提示出错: Server Tomcat v8.0 Server at localhost was unable to start within ...
- SCSS的基本操作
Sass是成熟.稳定.强大的CSS预处理器,而SCSS是Sass3版本当中引入的新语法特性,完全兼容CSS3的同时继承了Sass强大的动态功能. 特性概览 CSS书写代码规模较大的Web应用时,容易造 ...
- ssm开发垃圾分类查询系统 源码 mysql
需求 基于SSM实现一个垃圾分类查询管理系统, 用户可以根据自定义查询分类信息, 管理员可以对分类信息, 垃圾详情信息进行增删改查的管理 运行环境 jdk1.8,tomcat8.5,mysql5.6, ...
- app点击底部菜单切换标题
<!DOCTYPE HTML><html><head> <meta charset="utf-8"> <meta name=& ...
- HTML div标签
看成一个 纯净的箱子吧.....啥属性都没有....默认宽度100% 高度0高度是 按DIV里的 内容而变高也可以在 CSS里 设置 宽高....DIV就是 典型的 标签.. P UL LI 等 标签 ...
- python:文件读写
#!/usr/bin/python# -*- coding:utf-8 -*- #!/usr/bin/python# -*- coding:utf-8 -*- file1 = open('a.txt' ...