icar

怎么通俗的解释COM组件?

北城余情 提交于 2020-01-26 04:09:21
作者:知乎用户 链接:https://www.zhihu.com/question/49433640/answer/116028598 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 GUID:全局唯一标识符,可以看成是唯一的一个ID,类似于物理网址那样。IID:也就是接口的唯一ID。C++中本没有接口的概念,是COM强行引入的,也就是一个类中全部都是纯虚函数,这样的类称为接口(interface),微软甚至定义了一个宏,大概就是这样:#define interface struct;IUnknown接口:这个解释起来会比较麻烦。如 @灵剑 所说,当自己写的一个dll升级的时候,内部可能增加了成员,导致分配的空间发生变化,从而使得次dll和以前的dll不能兼容。这个就是臭名昭著的dll hell,为此微软最开始想了个很挫的方法,那就是在dll后面加上自己的版本号,如:myDll_1.dll, myDll_2.dll……如果你打开system32目录看看就知道是怎么回事了。但是这样总不是一个办法,假如有个实现类MyClass,我这样操作:MyClass* ptr = new MyClass(); MyClass可能在不同dll版本中占的空间不同产生兼容问题,我拿一个指向MyClass的指针调用方法也会产新问题,那么,如果是指向一个接口(只含有纯虚方法

两种语言实现设计模式(C++和Java)(六:装饰者模式)

依然范特西╮ 提交于 2019-12-18 01:15:56
装饰者模式的作用在于动态地为某一个类添加额外的功能,通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。 适用场景: 1.需要扩展一个类的功能,或给一个类添加附加职责。 2.需要动态的给一个对象添加功能,这些功能可以再动态的撤销。 3.需要增加由一些基本功能的排列组合而产生的非常大量的功能。 4.当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。 案例:买私家车,车辆的某一款会有不同的配置,用户根据需要添加这些配置,每项配置都会为车辆收取额外费用。 一.C++实现 1 #include <iostream> 2 3 using namespace std; 4 5 //车辆接口类 6 class ICar{ 7 public: 8 virtual int getPrice() = 0; 9 virtual string getName() = 0; 10 }; 11 12 //未进行装饰的简单车辆类 13 class Car:public ICar{ 14 public: 15 int getPrice(){ 16 return 100000; 17 } 18 string getName(){ 19 return

反射

£可爱£侵袭症+ 提交于 2019-12-08 14:00:36
新建一个控制台应用程序 Bike中的代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 反射 { public class Bike : ICar { public void Light() { Console.WriteLine("我有1个灯"); } public void Wheel() { Console.WriteLine("我有2个轮子"); } } } View Code Car中的代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 反射 { public class Car : ICar { public void Light() { Console.WriteLine("我有8个灯"); } public void Wheel() { Console.WriteLine("我有4个轮子"); } } } View Code Factory中的代码 using

[设计模式]简单工厂模式(Simple Factory)

帅比萌擦擦* 提交于 2019-11-27 04:42:46
Code using System; using System.Collections.Generic; using System.Text; namespace Learning.DesignPattern { // 简单工厂模式(Simple Factory) // 产品接口ICar public interface ICar { void Drive(); } // 具体的产品类实现ICar接口 public class HongQi : ICar { public void Drive() { Console.WriteLine( " The driver driving the HongQi! " ); } } public class DaZhong : ICar { public void Drive() { Console.WriteLine( " The driver driving the DaZhong! " ); } } // 工厂类: public class CarFactory { public static ICar DriveCar( string carName) { if (carName == " HongQi " ) { return new HongQi(); } else if (carName == " DaZhong " ) {