hur.cn - 华软网

 热门搜索

关于继承的一些问题

  作者:未知    来源:网络    更新时间:2011/9/6
我要做一个基类(比如视频控件),定义好虚方法,在显示画面(窗体中)动态的创建此控件,使用相同的方法比如:Init(),Start(),Stop()。
此基类作为开发包提供给别人,别人如果使用的厂家不同,要写新的视频子类(控件),只能够从我的基类继承,具体在窗体中引用不能改写了,都是我定义好的。
在此我就有点疑惑,如果我的程序中不引用别人的子类,能够根据他们的子类名称来动态创建对象吗?
---------------------
请大家提供思路,提供这样的基类行吗?如何实现?用CRuntimeClass吗?
VC很不熟悉,谢谢大家!
---华软 网友回答---
帮你顶下
---华软网友回复---
引用楼主 zpingy 的回复:
我要做一个基类(比如视频控件),定义好虚方法,在显示画面(窗体中)动态的创建此控件,使用相同的方法比如:Init(),Start(),Stop()。
此基类作为开发包提供给别人,别人如果使用的厂家不同,要写新的视频子类(控件),只能够从我的基类继承,具体在窗体中引用不能改写了,都是我定义好的。
在此我就有点疑惑,如果我的程序中不引用别人的子类,能够根据他们的子类名称来动态创建对象吗?
---……

定义好基类,其他人如果有不同的行为,就需要在Init Start, Stop等中实现自己的行为,然后你调用基类的指针就好了,多态就可以达到调用别人开发的行为
---华软网友回复---
其实你提供的也只是一个接口,将你的实现给封装起来,做成dll,然后只提供接口给厂家调用就是。注意基类的实现和接口是分开的(你当然不希望厂家看到你的实现吧)。这方面你要看一下ATL或者COM方面的知识。
---华软网友回复---
Init Start, Stop这3个方法的实现肯定是别人实现了,我只负责调用。别人实现的DLL放在我的目录下即可。我疑问的是我不引用别人的头文件,也可以动态调用吗?
我的想法是我提供界面开发平台,别人继承我的基类,实现,我只负责调用控件。不知道能否行得通,做个简单的DEMO测试下了。

---华软网友回复---
楼主的想法可行
---华软网友回复---
你定义好base class接口.. 然后自己程序只操作这些接口. 以后别人实现是他的事. 反正你会始终调用接口. 是可以的. 此为接口编程
---华软网友回复---
楼主你的想法其实就是这么两个学术问题:

在MFC里面叫做动态创建,在Java和C#里面叫做反射,就是框架如何创建用户自定义类型的问题:

http://tech.163.com/05/0405/10/1GIP27EB00091589.html
http://topic.csdn.net/u/20091117/19/7faa3bfe-cee9-43cb-b6ae-0a55559b6730.html

提供两个链接,先看看。
---华软网友回复---
包装成MFC扩展DLL,这个相应的比较好用些。

// the vedio window class
class __declsdec(dllexport) CVedioCtrl abstract : public CWnd
{
public:
    // constructor & destructor
    CVedioCtrl();
    virtual ~CVedioCtrl();

    // Implementation
    virtual void Initialize() = 0; // initialize the control status.
    virtual BOOL Start() = 0; // start to do vedio, or other things.
    virtual void Stop() = 0; // stop to do vedio.
};

类的接口声明这样写已经差不多了,在其中包装更多需要的方法即可。

至于动态创建,是一个实例化的过程,这个过程,无论是程序员,还是最终用户,它知道他想要的是什么,他自然会选定对应的对象,也就是说,这里他会告诉你,这个被实例化的类是什么类。这应该是一个管理框架类。
可以是这样,写一个Manager管理类,里面有一个方法,例如virtual CVedioCtrl* GetInstance();这个方法可以被重写,默认情况下,有一个实现,在DLL内部,这个方法返回一个默认的对CVedioCtrl接口对象的实现,return net CXXXXX();
这个Manager里,应该有一个清理方法,亦可以被重写,例如virtual void DisposeData(); 默认行为是清理这个CVedioCtrl*的对象,delete XXX;
如果你想要使用运行时,CRuntimeClass,MFC里有对应的宏,DECLARE_DYNCREATE(ThisClassName)和IMPLEMENT_DYNCREATE(ThisClassName, BaseClassName),那么,你还需要在这个管理类里添加一样东西,那就是保存即将被创建的对象的运行时信息,因此,你需要提供一个方法,供给用户去设置这些信息。

如果不使用运行时,那么这个创建的过程,完全可以由用户完成,在使用的时候,直接使用其它指针即可。
---华软网友回复---
up up
---华软网友回复---
好多的分啊,豪气啊
---华软网友回复---
你是通过接口调用的 接口就是一种契约 使用的人必须要遵循契约 
---华软网友回复---
还是有个问题没有想通,因为别人只能够继承我的基类来写子类,我的基类又不可能实现知道子类的头文件引用,那我的基类怎么调用别人写的子类呢?用名称配置的方式可以吗?
-------
因为前提条件是,我的程序已经写好了,别人基于我的做继承的子类控件,但是这个控件要在我的程序中能够调用(是我调用,不是子类控件调用)。这个什么方式好些?
---华软网友回复---
这个完全可以实现,我用directshow开发视频的时候很多方法都是封装好了的,像directshow提供的IMediaControl接口就实现了run stop pause这样一系列的方法,楼主的想法完全可行
---华软网友回复---
换种说法:即界面、基类都是我的,用户继承我的基类(编写DLL),我的界面要根据配置的文件(用户自己写的DLL名称,子类名称等)来调用子类。
这样可以实现吗?
----------------
感觉有点绕
---华软网友回复---
涉及到:动态加载用户的DLL,动态创建子类对象...
---华软网友回复---
自己顶一下      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。