102、区分接口和抽象类的应用场合
简单来说,抽象类解决的是"Is a" 接口解决的是"Can do"
103、区分组合和继承的应用场合
继承不仅仅指继承自某个类型,也可以指继承自某个接口,继承最大的优点就是多态
所以如果不使用多态,组合更能满足大部分应用场景。不要为了让代码看起来像“面向对象”,而滥用继承
104、用多态代替条件语句
类似于状态模式,用继承类来代替if 或者 switch,对拓展开放,对修改关闭
105、使用私有构造函数强化单例
//sealed类
public sealed class Singleton
{
static readonly object lockObj = new object();
private static Singleton instance;
public static Singleton GetInstance
{
get
{
if(instance == null)
{
//防止多线程重复调用 加锁
lock (lockObj)
{
instance = new Singleton();
}
}
return instance;
}
}
//私有构造函数
private Singleton() { }
}
106、为静态类添加静态构造函数
静态类初始化数据可以在静态构造函数里面初始化,为什么不能用实例构造函数呢?因为会报错
可以在静态构造函数里面捕捉数据初始化的异常
107、区分静态类和单例
单例是一个new 出来的一的实例对象,而静态类不可new
静态类不能被继承,也不能继承其他类,不能new,所以也不能当参数和返回值
108、将类型标识为sealed
如果一个类型确认没必要被继承,应该及时将其变为密封类
109、谨慎使用嵌套类
个人很少用到嵌套类
110、用类来代替enum
一个简单的类替代枚举的例子,注意构造方法要私有,防止外部实例化对象
class Week
{
public static readonly Week Monday = new Week(0);
public static readonly Week Tuesday = new Week(1);
private int _infoType;
private Week(int infoType)
{
_infoType = infoType;
}
}
111、避免双向耦合
A类中有B的引用 ,同时B类中有A的引用
一般来说,类型之间不应该存在双向耦合,如果出现,应该考虑重构
112、将现实世界中的对象抽象为类,将可复用对象圈起来就是命名空间
面向对象初级