封装
被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中"。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。
抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可视化,封装则使开发者实现所需级别的抽象。
C# 封装根据具体的需要,设置使用者的访问权限,并通过 访问修饰符 来实现。
一个 访问修饰符 定义了一个类成员的范围和可见性。C# 支持的访问修饰符如下所示:
- public:所有对象都可以访问;
- private:对象本身在对象内部可以访问;
- protected:只有该类对象及其子类对象可以访问
- internal:同一个程序集的对象可以访问;
- protected internal:访问限于当前程序集或派生自包含类的类型
Public 访问修饰符
Public 访问修饰符允许一个类将其成员变量和成员函数暴露给其他的函数和对象。任何公有成员可以被外部的类访问。
下面的实例说明了这点:
using System; namespace RectangleApplication { class Rectangle { //成员变量 public double length; public double width; public double GetArea() { return length * width; } public void Display() { Console.WriteLine("长度: {0}", length); Console.WriteLine("宽度: {0}", width); Console.WriteLine("面积: {0}", GetArea()); } }// Rectangle 结束 class ExecuteRectangle { static void Main(string[] args) { Rectangle r = new Rectangle(); r.length = 4.5; r.width = 3.5; r.Display(); Console.ReadLine(); } } }
当上面的代码被编译和执行时,它会产生下列结果:
长度: 4.5 宽度: 3.5 面积: 15.75
继承
在面向对象的编程中,有两种截然不同继承类型:实现继承和接口继承
1.实现继承和接口继承
*实现继承:表示一个类型派生于基类型,它拥有该基类型的所有成员字段和函数。在实现继承中,派生类型采用基类型的每个函数的实现代码,除非在派生类型的定义中指定某个函数的实现代码。在需要给现有的类型添加功能,或许多相关的类型共享一组重要的公共功能时,可以使用这种类型的继承。
*接口继承:表示一个类型只继承了函数的签名,没有继承任何的代码。在需要指定该类型具有某些可用的特性时,最好使用这种类型的继承。
2.多重继承
C#不支持多重继承,但C#允许类型派生自多个接口————多重接口继承。这说明,C#类可以派生自另一个类和任意多个接口。更准确的说,因为System.Object是一个公共的基类,所以每个C#(除Object之外)都有一个基类,还可以有任意多个接口。
3.结构的继承
使用结构的一个限制是结构不支持实现继承,但每个结构都自动派生自System.ValueType。不能编码实现类型层次的结构,但结构可以实现接口。
二.继承的实现
语法:
class MyDreved:BaseClass
{
}
1.虚方法
把一个基类函数声明为virtual,就可以在任何派生类中重写(override)该函数:
class BaseClass
{
public virtual void VirtualMethod()
{
//
}
}
也可以把属性声明为virtual。对于虚属性或重写属性,语法与非虚属性相同,但要在定义中添加virtual关键字:
public virtual string Name
{
get;set;
}
C#中虚函数的概念与标准OOP的概念相同:可以在派生类中重写虚函数。在调用方法时,会调用该派生类的合适方法。在C#中,函数默认情况下不是虚的,但(除了构造函数)可以显式的声明为virtual。
修饰符
修饰符可以指定方法的可见性:如public或private,还可以指定一项的本质,如方法是virtual或abstract.
1.可见性修饰符
修饰符 应用于 说明
public 所有类和成员 任何代码可以访问
protected 类的成员和内嵌类 只有在类内部和派生类中访问
internal 所有类和成员 只有在类内部和包含它的程序集中访问
private 类的成员和内嵌类 只有在类内部访问
protected internal 类的成员和内嵌类 只有在类内部,派生类中和包含它的程序集中访问
不能把类定义为protected,private,protected internal,因为这些修饰符对于包含在名称空间中的类型没有意义。因此这些修饰符只能应用于成员。但是可以用这些修饰符定义嵌套的类(内嵌类,包含在其它类中的类),因为在这种情况下,类也具有成员的状态:
public class OuterClass
{
protected class InnerClass
{
}
}
2.其它修饰符
修饰符 应用于 说明
new 函数 隐藏函数
static 所有成员 静态
virtual 函数 成员可以由派生类重写
abstract 类,函数 抽象
override 函数 重写虚拟和抽象的成员
sealed 类,方法,属性 不能继承和重写
extern 仅静态方法 成员在外部用另一种语言实现
接口
public interface IDisposable
{
void Dispose();
}
声明接口在语法上和声明抽象类完全相同,但不允许提供任何成员的实现方式。抽象类可以提供除方法之外的其它成员的实现方式,比如属性。
一般情况下,接口只能包含方法,属性,索引器和事件的声明。
不能实例化接口,接口即不能有构造函数,也不能有字段。接口定义也不允许包含运算符重载。
在接口中不允许声明关于成员的修饰符。接口成员总是公有的,不能声明为虚拟和静态。如果需要,在实现的类中声明。
实现接口的类必须实现接口的所有成员。
接口可以彼此继承,其方式与类的继承方式相同。
多态
多态正如字面意思,多种形态,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法,允许将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作; --------------------- 本文来自 李丽贝-Arielle 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qiqibei666/article/details/81090070?utm_source=copy
多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。
多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。
1、在父类的方法中加入virtual,这个方法可以被子类重新写一遍。
在子类的方法前加入override
多态就是指不同的对象收到相同的消息,会产生不同的行为,同一个类在不同的场合下表现出不同的行为特征;
多态的作用:把不同的子类都看作是父类,可以屏蔽到不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化