C# 面向对象基础
2013-05-14 19:57 hduhans 阅读(213) 评论(0) 收藏 举报一、基本知识
1.修饰符:共13种,按功能分为三部分,分别是访问修饰符,类修饰符和成员修饰符
① 访问修饰符
| public | 公有访问,访问不受限制,只要在不同项目中引用其他项目,就可以访问其他项目中public的成员 |
| private | 私有访问,只能在声明的类或结构体内访问 |
| protected | 保护访问,只能在当前类和派生类体内访问,当前项目不能访问 |
| internal | 访问仅限于当前程序集,同一个项目可以访问internal成员和对象,不同项目中即使引用了其他项目,也无法访问其他项目中的internal成员 |
| protected internal | 访问仅限于包含类或从包含类派生的类型,只有包含该成员的类以及继承的类可以访问,同时结合protected和internal特点,在当前项目中可以访问,在派生类体内中也可以访问 |
② 类修饰符
| abstract | 抽象类,指示当前类只能作为其他类的基类,抽象类不一定有抽象方法(但有抽象方法的一定是抽象类),且抽象类不能实例化对象 |
| sealed | 密封类,指示当前类不能被继承 |
| static | 静态类,静态类仅包含静态成员,不能被实例化,是密封的不能被继承,不能包含实例构造函数(可以包含静态构造函数) |
③ 成员修饰符
| abstract | 指示方法或属性没有实现 |
| const | 常量(默认是静态的),指定域或局部变量的值不能被改动,值在声明时初始化, |
| readonly | 只读,值可以在运行时初始化,即readonly字段可以在声明或构造函数中初始化,因此,使用不同的构造函数,readonly初始化的值可能不同 |
| override | 对基类中的抽象方法或虚方法的重写 |
| extern | 声明在外部实现的方法,常与DllImport同用 |
| event | 声明事件 |
2.字段与属性的区别:1) 字段有存储数据的功能,属性没有存储数据的功能 2) 使用属性增强安全性,在类外调用时可避免暴露字段名 3) 属性的set和get函数可以限制字段的一些功能,以达到某种目的
① 字段:如 private String name;
② 属性:如 private String name;public String name{get{return this.name};set{this.name=value;}} 可以在set,get时做一些特殊的限定,
简写:public String name{get;set;} 简写时无法做复杂的操作和限定 (若想达到只再类体内调用get或set方法,可加private修饰符)
3.构造函数:主要用来在创建对象时初始化对象
① 默认构造函数:如果用户定义的类中没有显示的定义任何构造函数,编译器就会自动为该类生成默认构造函数,当用户显示地声明了了任何构造函数,编译器就不会默认生成默认的构造函数,需要用户自己定义。
② 静态构造函数(static):当类中有静态成员时,初始化这些静态成员变量可以在声明时初始化,也可以在静态构造函数中初始化(如果初始化稍复杂)。一个类只能有一个静态构造函数,此静态构造函数不能有访问修饰符,也不能带任何参数,静态构造函数不能直接调用,只能在下述情况下由系统自动执行:1) 创建包含静态构造函数的类实例时 2) 访问包含静态构造函数的类静态成员时
4.命名空间:与类所在路径无关(这点与java的包有区别),命名空间不能加任何修饰符。
二、定义类(引用类型)
1.类修饰符:
一级:internal(内部类,默认)、public(公共类) 表示类的可访问性,默认internal,public可访问性大于internal
二级:abstract(抽象类)、sealed(密封类)、static(静态类)
三级:partial(局部类)
2.抽象类(abstract):抽象类是特殊的类,不能被实例化。具有抽象方法的类一定是抽象类,但抽象类可以不包含抽象方法。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖抽象方法。此外,抽象类可以继承另一个抽象类,可以覆盖也可不覆盖基类中的抽象方法,如果不覆盖,则其派生类必须覆盖它们,如果覆盖,派生类无须也无法覆盖基类的基类中的抽象方法。
接口与抽象类的相似之处:①不能实例化 ②包含未实现的方法声明 ③派生类必须实现未实现的方法(抽象类是抽象方法,接口则是所有成员,包括方法和成员)
3.密封类(sealed):密封类不能被继承
4.静态类(static):静态类仅包含静态成员,不能被实例化,是密封的且不能被继承,不能包含实例构造函数(可以包含静态构造函数)。当我们希望一个类只包含静态成员,且不能用于实例化对象时,可以使用静态类。
5.局部类(partial):局部类允许我们将一个类、结构或接口分别定义在不同的文件中。
局部类适用于以下情况:(1) 类型特别大,不宜放在一个文件中实现;(2) 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起;(3) 需要多人合作编写一个类。
局部类使用限制:(1) 局部类只适用于类、接口、结构,不支持委托和枚举;(2) 同一个类型的各个部分必须都加修饰符partial;(3) 使用局部类时,一个类型的不同部分必须位于相同的命名空间中。
局部类的修饰符:局部类各个部分的访问修饰符必须维持一致性,如果其中一个部分使用了abstract修饰符,则整个类被视为抽象类;如果其中一个部分使用了sealed修饰符,则整个类被视为密封类;如果各个部分使用了不同的访问修饰符,则编译无法通过。
三、定义接口(interface)
1.接口修饰符:
一级:internal(内部接口,默认)、public(公共接口)
二级:partial(局部接口) 将接口定义在不同的文件中
2.接口是一种约定,使得实现接口的类或结构在形式上保持一致,从而使程序更加清晰和条理化。接口中只能包含方法、属性、索引器和事件的声明,除此之外,不能包含任何其他的成员,例如:字段、常量、域、构造函数、析构函数、静态成员。接口成员默认总是共有的,因此不允许声明任何修饰符,即使是public也不行。继承接口的类必须实现接口方法,且必须是public的。一个示例如下:
interface IMyExample { string this[int index] { get; set; } //索引 event EventHandler Even; //事件 void Find(int value); //方法 string Point { get; set; } //属性 }
3.类和结构可以继承多个接口,接口也可以继承多个接口,接口继承接口后继承了接口的成员定义;
4.接口与抽象类的区别参看http://www.cnblogs.com/lovemyth/archive/2008/09/08/828909.html
四、继承
1.派生类隐式继承基类的除构造函数和析构函数之外的所有成员。派生类只能有一个直接基类(C语言支持多继承),继承时可以传递的。派生类的可访问性不能比基类的可访问性高(例:public不能继承internal)。
2.基类的构造函数是无参数的,在派生类中不需要手动初始化基类的构造函数;如果基类的构造函数是有参数的,那么在派生类中此构造函数必须被执行,在派生类的构造函数中初始化,使用base关键字,如:
class A { int _i; public A(int i) { this._i = i; } } class B : A { public B(int i):base(i) { //初始化基类构造函数 } }
五、定义成员(包括:字段、属性、方法、索引器和事件)
1.成员修饰符:
一级:private(私有成员,默认)
public(共有成员)
protected(保护成员,当前类和派生类可以访问)
internal(内部成员,只能由定义它的程序集可以访问)
protected internal(当前类和继承类的程序集可以访问)
二级:static(静态成员)
const(常成员 不能修饰方法 值在声明时初始化,不可改变,默认是静态的)
readonly(只读成员 不能修饰方法 值可以在运行时初始化,即readonly字段可以在声明或构造函数中初始化,因此,使用不同的构造函数,readonly初始化的值可能不同)
abstract(抽象 可以修饰方法、属性、索引器和事件,不能修饰字段,不能有方法体,必须公有,方法必须重写)
override(重写方法 可以修饰方法、属性、索引器和事件,不能修饰字段,重写虚方法和抽象方法)
new(隐藏基类继承的成员或继承的接口成员,与override相反,继承基类时,派生类新写方法与基类方法名重复时使用)
sealed(密封,可以修饰方法和属性,修饰方法和属性时,必须结合override,覆盖基类的抽象或虚方法时,使用sealed可密封方法,在后续派生类中无法重写此密封方法)
virtual(虚方法,可以修饰方法、属性、索引器和事件,不能修饰字段,用于实现多态,必须公有,方法可以重写)
extern(外部实现方法)
event(事件)
浙公网安备 33010602011771号