代码改变世界

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; }    //属性
} 
View Code

  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) {   //初始化基类构造函数
           
    }
}
View Code

 

五、定义成员(包括:字段、属性、方法、索引器和事件)

  1.成员修饰符:

     一级:private(私有成员,默认)

      public(共有成员)

      protected(保护成员,当前类和派生类可以访问)

      internal(内部成员,只能由定义它的程序集可以访问)

      protected internal(当前类和继承类的程序集可以访问)     

   二级:static(静态成员)

      const(常成员 不能修饰方法 值在声明时初始化,不可改变,默认是静态的)

      readonly(只读成员 不能修饰方法 值可以在运行时初始化,即readonly字段可以在声明或构造函数中初始化,因此,使用不同的构造函数,readonly初始化的值可能不同)

      abstract(抽象 可以修饰方法、属性、索引器和事件不能修饰字段,不能有方法体,必须有,方法必须重写)

      override(重写方法 可以修饰方法、属性、索引器和事件,不能修饰字段,重写虚方法和抽象方法)

      new(隐藏基类继承的成员或继承的接口成员,与override相反,继承基类时,派生类新写方法与基类方法名重复时使用)

      sealed(密封,可以修饰方法和属性,修饰方法和属性时,必须结合override,覆盖基类的抽象或虚方法时,使用sealed可密封方法,在后续派生类中无法重写此密封方法)

      virtual(虚方法,可以修饰方法、属性、索引器和事件不能修饰字段,用于实现多态,必须公有,方法可以重写)

      extern(外部实现方法)

      event(事件)