精彩的代码是如何想出来的,要比看到精彩的代码更加令人期待。
如果想成为一名更优秀的软件设计师,了解优秀软件设计的演变过程比学习优秀设计本身更有价值,因为设计的演变过程中蕴藏着大智慧。
通过这些模式让你找到“封装变化”、“对象间松散耦合”、“针对接口编程”的感觉,从而设计出易维护、易扩展、易复用、灵活性好的程序。
对象是一个自包含的实体,用一组可识别的特性和行为来标识。
自包含----自身包含了自身的所有信息,当重用时不必包含其它的构件。
类就是具有相同的属性的抽象的集合。
类名称首字母要大写,多个单词则每个首字母都大写。
没有构造方法时,系统会生成为空的默认的构造方法。
方法重载同名而使用不同的参数类型或个数。
方法重载可以在不改变方法的基础上新增功能。
属性是一个或一对方法,在调用看来是一个字段。字段是存储类满足设计所需的数据,是类相关的变量。
private int shortNum = 3; public ShortNum { get { return value; } set { shortNum = value; } }
类中的成员若没有加修饰符,默认为private。
通常字段是private,属性是public。
字段一般是首字母小写或前加‘_’。
利用get和set来控制私有字段的读写。
//字段是只读的 private int shortNum = 3; public ShortNum { get { return value; } } //控制shortNum的值 private int shortNum = 3; public ShortNum { get { return value; } set { if(value < 10) shortNum = value; else shortNum = 10; } }
每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装,因此对象不必依赖其他对象来完成自己的操作。
封装减少耦合,类内部可自由更改,有清晰的对外接口。
子类继承于父类,子类拥有父类非private的属性和功能,子类可以扩展出自己的属性和功能,子类还可以以自己的方式实现父类的功能(方法重写)。
protected修饰的类成员,对子类公开,但是不对其他类公开。
子类从父类继承方法、域、属性、事件、索引指示器,但对于构造方法,它不能被继承,只能被调用。对于调用父类的成员可以用base关键字。
class Cat : Animal { public Cat() : base() { } public Cat(string name) : base(name) { } }
继承使得代码得到了共享,避免了重复。
继承的缺点:父类变,子类会跟着改变;破坏包装,父类实现细节暴露给子类。
继承是强耦合的关系。
多态表示不同的对象可以执行相同的动作,但要通过他们自己的实现代码来执行。
注意:子类以父类的身份出现,子类在工作时以自己的方式来实现,子类以父类的身份出现时,子类特有的属性和方法不可以使用。
对象的声明必须是父类,而不是子类,实例化的对象是子类,这才能实现多态。
Animal animal = new cat();
C#允许把类和方法声明为abstract,即抽象类和抽象方法。
abstract class Animal { //... protected abstract string getShoutSound(); }
注意:如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否包含其他一般方法。
让抽象类拥有尽可能多的共同代码,拥有尽可能少的数据。
在一个以继承关系形成的等级结构里面,树叶节点应当是具体类,而树枝节点均应当是抽象类。