封装:
封装就是将成员变量和成员方法等集合在一个个的类中,通过给类及类中的成员变量、属性和方法设置不同的访问修饰符(public、protected、internal、protected internal、private)来控制它们的作用范围,使用时调用它的方法,或者给它的变量赋值。封装的意义在于保护或者防止代码(数据)被我们无意中破坏。
书面的解释如下:
每个对象都包含它能进行操作所需要的所有信息,因此对象不必依赖其它的对象来完成自己的操作。
继承:
以人为例,每个人都有姓名,年龄,和吃穿住行等行为。如果我们把每个人的代码都写出来,这些将有很多重复,而且代码量太大。如果只构建一个人类,其他的人可以直接使用他的属性和方法,将会给我们带来大大的便利。这就是继承。
注意:
1.继承具有传递性,由A:B B:C=>A:C
2.构造方法不能继承
3.C#只允许单继承,一个类只能继承于一个父类
4.方法名相同(方法重写),最终使用的是子类的方法。
5.子类拥有父类非private的属性和功能;比如protected表示继承时子类可以对基类有完全访问权,也就是说,用protected修饰的类成员,对子类公开,但不对其他类公开。
书面的解释如下:
对象的继承代表一种"is-a"的关系,假如两个对象A和B,如果可以描述为"B就是A",那么则表示B可以继承自A。
多态:
多态性是指“多种行为”。同样的方法调用后,执行不同的操作,运行不同的代码,在不同的类中有不同的体现。多态性可以简单概述为“一个接口,多种方法”。
多态分为静态多态和动态多态。静态多态,函数的响应是发生在编译时;动态多态,函数的响应是发生在运行时。
静态多态:
分别为函数重载和运算符重载。
函数重载:同一个类中有多个方法的名称相同、参数个数不同或类型不同。(同一个类中有多个方法名称相同、参数个数相同、参数类型相同、返回值类型不同,这样不属于重载,编译时会报错。)
函数重载举例:
using System;
namespace PolymorphismApplication
{
class Printdata
{
void print(int i)
{
Console.WriteLine("Printing int: {0}", i );
}
void print(double f)
{
Console.WriteLine("Printing float: {0}" , f);
}
void print(string s)
{
Console.WriteLine("Printing string: {0}", s);
}
static void Main(string[] args)
{
Printdata p = new Printdata();
// 调用 print 来打印整数
p.print(5);
// 调用 print 来打印浮点数
p.print(500.263);
// 调用 print 来打印字符串
p.print("Hello C++");
Console.ReadKey();
}
}
}
结果:
Printing int: 5
Printing float: 500.263
Printing string: Hello C++
调用同样名称的方法,因为参数类型不同,结果不同。
动态重载:
C# 允许您使用关键字 abstract 创建抽象类,用于提供接口的部分类的实现。当一个子类继承自该抽象类时,实现即完成。抽象类包含抽象方法,抽象方法可被子类实现。子类具有更专业的功能。动态多态性是通过 抽象类 和 虚方法 实现的。
请注意,下面是有关抽象类的一些规则:
您不能创建一个抽象类的实例。
您不能在一个抽象类外部声明一个抽象方法。
通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed。
当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法。虚方法是使用关键字 virtual 声明的。虚方法可以在不同的继承类中有不同的实现。对虚方法的调用是在运行时发生的。
重写:函数名和参数完全相同只不过内部实现不同,不能同时处于一个类的内部。
多态通过虚函数(virtual)来实现,虚函数允许子类重新定义成员函数,子类重新定义父类的做法叫做重写。重写分为两种:直接重写成员函数和重写虚函数,只有重写了虚函数才能更好的体现C#的多态。
三大特性之间的关系:
1、继承时父类中的内容需要封装。通过访问修饰符,来限制访问,如有些方法子类不能使用,则用private来修饰。