C# / JAVA中面向接口编程相对简单一些,特别是JAVA,更是如此,整个类库很多都是基于接口和设计模式搞出来的。
由于这些开发语言都具备内存GC机制,所以很多情况下不必关心创建出来的对象的销毁,而C++不同,new/delete的配对曾经搞得众多C++程序员焦头烂额。 好,重归主题,C++面向接口编程需要哪些必备知识和工具呢?
必备知识:
1,面向抽象而不是面向具体编程
2,设计模式
必备工具:
1,智能指针(不是auto_ptr,而是引用计数智能指针)
2,类工厂
3,容器
当我们要进行面向接口编程时(我定义接口实现者和接口调用者以区别实现方与调用方):
1,定义出一系列的接口以及接口纯虚函数,然后创建出一系列的接口实现类。
2,接口实现者有义务创建这一系列接口的类工厂,封装接口具体实现类的创建过程。
3,接口调用者明确类工厂的创建出来的产品是new出来的,使用完有必要delete,因此需要使用 SharedPtr。
4,接口调用者需要使用容器(比如std::vector)存储这些抽象接口指针(里面保存智能指 针),并且不要假设里头的这些接口指针的子类行为(即里头不要写 if(dynamic_cast<MyClass*>(&*pBase))这样的代码)。
5,接口实现者可以实现配对类这样能够展示接口函数之间联系的类以方便接口调用者使用,接口调用者也可以实现类似这样的能够粘合接口与接口之间联系的类。不倡议直接写逻辑代码表示接口函数之间的联系,因为如果两个或多个接口函数之间有联系,那么这种联系必然是有内在固定联系的,比如init/release,那么如果直接写代码的话,就算这些函数只是接口函数,那么也会引起代码的复杂化,因为具体的代码肯定有分支和异常,很容易要在多个不同的分支和异常中展现这种联系,必然引起复杂化和代码难以理解,而使用类构造函数和析构函数就可以避免这种复杂化(如果多于三个以上接口函数的复杂联系,可以使用类以及类中类的方式表现其联系,如果这些函数之间的联系还跟其返回值有关,那么构造函数需要参数,以及提供一个标准的GetReturn函数得到其参数或返回值后再作进一步处理)。
通过以上的方法与步骤,可以看出,其实面向接口编程也有一套章法和内在的稳定结构。
1,面向抽象而不是面向具体编程
2,设计模式
必备工具:
1,智能指针(不是auto_ptr,而是引用计数智能指针)
2,类工厂
3,容器
当我们要进行面向接口编程时(我定义接口实现者和接口调用者以区别实现方与调用方):
1,定义出一系列的接口以及接口纯虚函数,然后创建出一系列的接口实现类。
2,接口实现者有义务创建这一系列接口的类工厂,封装接口具体实现类的创建过程。
3,接口调用者明确类工厂的创建出来的产品是new出来的,使用完有必要delete,因此需要使用 SharedPtr。
4,接口调用者需要使用容器(比如std::vector)存储这些抽象接口指针(里面保存智能指 针),并且不要假设里头的这些接口指针的子类行为(即里头不要写 if(dynamic_cast<MyClass*>(&*pBase))这样的代码)。
5,接口实现者可以实现配对类这样能够展示接口函数之间联系的类以方便接口调用者使用,接口调用者也可以实现类似这样的能够粘合接口与接口之间联系的类。不倡议直接写逻辑代码表示接口函数之间的联系,因为如果两个或多个接口函数之间有联系,那么这种联系必然是有内在固定联系的,比如init/release,那么如果直接写代码的话,就算这些函数只是接口函数,那么也会引起代码的复杂化,因为具体的代码肯定有分支和异常,很容易要在多个不同的分支和异常中展现这种联系,必然引起复杂化和代码难以理解,而使用类构造函数和析构函数就可以避免这种复杂化(如果多于三个以上接口函数的复杂联系,可以使用类以及类中类的方式表现其联系,如果这些函数之间的联系还跟其返回值有关,那么构造函数需要参数,以及提供一个标准的GetReturn函数得到其参数或返回值后再作进一步处理)。
通过以上的方法与步骤,可以看出,其实面向接口编程也有一套章法和内在的稳定结构。