C# 封装继承多态
一、面向对象
什么是对象?对象可以是任何具体的事物,也可以是抽象的事件计划规则。面向对象作为一种思想,可以理解为对对象的具现化赋予功能性。
C#具有面向对象的语言所应有的一切特性:封装、继承与多态,为面向对象三要素。
二、封装
封装就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
如何封装?
- Public – 允许任何人来访问
- Internal – 在同一项目中均可访问
- Protected – 继承时子类可以对基类有访问权
- Protected Internal – 唯一的一种组合限制修饰符,只可以被本组合体内所有的类和这些类的子类所访问
- Private --只允许同类中的成员所访问
继承
一个类可以有能力直接从另一个类获取其代码和数据。
派生类(子类)从基类(父类)那里获取其所有成员
派生类又称子类,则基类又称父类
- 可以从基类中获取得:方法,域,属性,事件,索引指示器
- 不能获得:构造函数,析构函数
继承模板:
- public class 派生类:基类
注意:C#只允许单继承。意思就是只能一对一继承。
防止继承:
- public sealed class XX
派生类如何调用基类成员?
-
使用base关键字
在派生类中 base.基类成员 -
派生类在访问基类时有一定的限制,不能访问private的成员;Internal的基类成员只能被同一个程序集中的派生类访问
当派生类与基类成员名一致时,可用this访问本类,base访问基类。
多态
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。
多态性通过派生类覆写基类中的虚函数方法来实现。
C#中支持两种多态性:
- 编译时 --重载(overload)
- 运行时 --虚方法和重写(override)
重载:
可以存在两个或者多个方法名一致的的方法,不过这些方法的参数不同。
调用时以方法参数区分具体调用哪个方法。
例如:
public int math(int a) //方法一
{
int x = a * a;
return x;
}
public double math(double a) //方法二
{
double x = a + a;
return x;
}
调用:
var a = math(2);
var b = math(1.1);
结果: a=4 则 b=2.2;
虚方法与重写:
虚成员:就是在基类中申明了方法、属性、索引器或事件,也就是做一个简单的处理。
使用virtual关键字将成员申明为虚成员。
重写:
在声明时,父类的方法前面加上virtual关键字,子类的方法前面加上override关键字,且与父类方法同名,表示父类的方法可以被子类进行修改和重新定义。
public class C1
{
public virtual int math() //虚方法,等待被重写
{
return 1;
}
}
public class C2 : C1 //C2继承于C1
{
public override int math()
{
return 2;
}
}
调用:
C1 c1 = new C1();
Console.WriteLine("屏幕显示是:{0}", c1.math());
C1 c2 = new C2();
Console.WriteLine("屏幕显示是:{0}", c2.math());
结果: 返回的值分别为 1、2