C#程序设计的方法论:面向对象

阅读:151 - - 类别:《DotNet
  1. 现实中的事物抽象为类(class),基本要素:字段(field)也即变量;方法(method)也即函数。
  2. 构造方法(constructor):主要作用是完成对象的初始化工作。

– ① 构造方法的方法名与类名相同;
– ② 构造函数没有返回类型,也不能写 void。
– ③ 如果用户没有自定义任何构造方法,则系统会自动产生一个 public Person(){}

  1. 对象的创建:构造方法不能显示地直接调用,而是使用 new 来调用。
  2. this的使用:

– ① 指这个对象本身
– ② 常用于访问这个对象的字段及方法(VS 会智能提示)
– ③ 用于区分字段与局部变量
– ④ 用于构造方法调用另一个构造方法,如 public Person():this(0,""){}

  1. 属性(property)的书写:
private string _name;

public string Name
{
    get
    {
        return _name;
    }
    set
    {
        _name = value;
    }
}

可简写为:

public string Name{set;get;}
  1. 属性与字段的比较:

– ① 属性实际上是方法;
– ② 可以只读或只写:只有 get 或 set
– ③ 可以进行有效性检查:if …
– ④ 可以计算得到的数据
– ⑤ 可以定义抽象属性

  1. 索引器(Indexer)
修饰符 类型名 this[参数列表]
{
    set
    {
    }
    get
    {
    }
}
  1. 属性与索引的比较:
属性 索引器
通过名称标识 通过参数列表进行标识
通过简单名称来访问 通过[ ]运算符来访问
可以用 static 修饰 不能用 static 修饰
属性的 get 访问器没有参数 索引的 get 访问器具有与索引相同的参数列表
属性的 set 访问器包含隐式 value 参数 除了 value 参数外,索引的 set 访问器还具有与索引相同的参数列表
可以继承 可以继承
  1. 使用继承(inheritance)
  • 继承窗体示例:public class Form1:System.Windows.Forms.Form
  • 子类 subclass、父类 baseclass
  • C#中采用单继承
  • 所有的类都是通过直接或间接地继承 object(即 System.Object)得到的。如:class SubClass:BaseClass{}
  • 子类自动地从父类那里继承所有的字段、方法、属性、索引器等成员作为自己的成员
  • 除了继承父类的成员外,子类还可以添加新的成员,隐藏或修改父类的成员。
  1. 继承中与父类同名的方法处理:

– ① 定义同名、但参数列表(签名)与父类不同的方法,这称为对父类方法的重载(Overloading)
– ② 定义同名且参数列表也与父类相同的方法,这称为新增加一种方法,用 new 表示
– ③ 定义同名且参数列表也与父类相同的方法,而且父类的方法用了 abstract 或 virtual 进行了修饰,子类的同名方法用了 override 进行了修饰,这称为虚方法的覆盖(Overriding)

  1. 常用运算符:
    as 运算符

    • 示例:Student s3 = p1 as Student;

– as 只能针对引用型变量
– 如果不能转换,as 运算不会引起异常,只是值为 null

② **is 运算符**

– 示例:if(p is Person)
– 判断一个对象是不是某个类(及其子类)的实例

③ **typeof() 运算符**

– 示例:Type t = typeof(变量);Type t = typeof(类名);
– 获得其运行时的类型

  1. 访问控制符列表
    C#程序设计的方法论:面向对象
  2. static 控制符详解:

    • static 的字段、方法、属性是属于整个类的
    • static 方法中,不能访问实例变量
    • 调用 static 方法时,直接用类名访问
    • static 变量可以用来表示“全局变量”
    • 类名使用 static 来修饰,其内字段、方法全为 static
    • static 构造方法只会调用一次,但其调用时间是不确定的
  3. const 相当于静态常量,只能用于基本类型及 string。如 Math.PI;readonly 相当于不可改量,只能修饰字段,在构造方法中赋值或者在声明时就赋值,只能赋一次值。
  4. 其他类:

    • sealed 类不可继承,如 String、Console、Math、Convert、Graphics、Font等
    • abstract 类不可实例化(new),是抽象的,如 Array、RandomNumberGenerator
  5. 接口(interface)相当于抽象类,一个抽象成员的集合。如 ICloneable、IComparacle、IConvertible、IDisposable、IFormattable、IEnumerable
  6. 定义一个接口

public interface IStringList
{
    void Add(string s);
    int Count{get;}
    string this[int index]{get;set;}
}

public abstract这两个关键词不加。

  1. 实现接口
class 类名:[父类,]接口,接口,...,接口
{
    ...
}
  1. 显示接口成员实现:
    • 方法名前写接口名:void IWindow.Close(){...}
    • 调用时,只能用接口调用:((IWindow)f).Close();
    • 在不同接口的方法相同时,能消除歧义
  2. 结构(struct)实现方式:
struct 结构名 [: 接口名]
{
    ...
}

结构是隐式 sealed ;因此它们不能被继承。

  1. 使用 struct 注意列表:
    • struct 是值类型
    • 结构不能包含无参数构造方法
    • 每个字段在定义时,不能给初始值
    • 构造方法中,必须对每个字段进行赋值
    • 实例化时,使用 new,值类型变量在赋值时,实行的是字段的 copy
  2. 枚举(enum)声明及使用:

enum MyColor
{
    Red,
    Green = 1,
    Blue = 2
}
MyColor c = MyColor.Red;
  1. 面向对象(Object Oriented)的三大特点:
    • 继承 inheritance
      • 子类继承父类的成员、还可增加、调用、隐藏
      • 提高软件模块的可重用性和可扩充性
    • 封装 encapsulation
      • 使用接口,而不关心具体的类
      • 使用属性,而将字段设为 private
    • 多态 polymorphism
      • 相同的方法,不同的参数
      • 自动调用子类相应的方法

评论已关闭!