关于继承的一些问题

zpingy 2011-09-06 03:53:53
我要做一个基类(比如视频控件),定义好虚方法,在显示画面(窗体中)动态的创建此控件,使用相同的方法比如:Init(),Start(),Stop()。
此基类作为开发包提供给别人,别人如果使用的厂家不同,要写新的视频子类(控件),只能够从我的基类继承,具体在窗体中引用不能改写了,都是我定义好的。
在此我就有点疑惑,如果我的程序中不引用别人的子类,能够根据他们的子类名称来动态创建对象吗?
---------------------
请大家提供思路,提供这样的基类行吗?如何实现?用CRuntimeClass吗?
VC很不熟悉,谢谢大家!
...全文
125 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zpingy 2011-09-08
  • 打赏
  • 举报
回复
自己顶一下
Ginie 2011-09-07
  • 打赏
  • 举报
回复
这个完全可以实现,我用directshow开发视频的时候很多方法都是封装好了的,像directshow提供的IMediaControl接口就实现了run stop pause这样一系列的方法,楼主的想法完全可行
zpingy 2011-09-07
  • 打赏
  • 举报
回复
还是有个问题没有想通,因为别人只能够继承我的基类来写子类,我的基类又不可能实现知道子类的头文件引用,那我的基类怎么调用别人写的子类呢?用名称配置的方式可以吗?
-------
因为前提条件是,我的程序已经写好了,别人基于我的做继承的子类控件,但是这个控件要在我的程序中能够调用(是我调用,不是子类控件调用)。这个什么方式好些?
zpingy 2011-09-07
  • 打赏
  • 举报
回复
涉及到:动态加载用户的DLL,动态创建子类对象...
zpingy 2011-09-07
  • 打赏
  • 举报
回复
换种说法:即界面、基类都是我的,用户继承我的基类(编写DLL),我的界面要根据配置的文件(用户自己写的DLL名称,子类名称等)来调用子类。
这样可以实现吗?
----------------
感觉有点绕
  • 打赏
  • 举报
回复
你是通过接口调用的 接口就是一种契约 使用的人必须要遵循契约
upc_xiaowei 2011-09-06
  • 打赏
  • 举报
回复
好多的分啊,豪气啊
faremn000 2011-09-06
  • 打赏
  • 举报
回复
up up
TearyWang 2011-09-06
  • 打赏
  • 举报
回复
包装成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),那么,你还需要在这个管理类里添加一样东西,那就是保存即将被创建的对象的运行时信息,因此,你需要提供一个方法,供给用户去设置这些信息。

如果不使用运行时,那么这个创建的过程,完全可以由用户完成,在使用的时候,直接使用其它指针即可。
healer_kx 2011-09-06
  • 打赏
  • 举报
回复
楼主你的想法其实就是这么两个学术问题:

在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

提供两个链接,先看看。
smwhotjay 2011-09-06
  • 打赏
  • 举报
回复
你定义好base class接口.. 然后自己程序只操作这些接口. 以后别人实现是他的事. 反正你会始终调用接口. 是可以的. 此为接口编程.
quwei197874 2011-09-06
  • 打赏
  • 举报
回复
楼主的想法可行
zpingy 2011-09-06
  • 打赏
  • 举报
回复
Init Start, Stop这3个方法的实现肯定是别人实现了,我只负责调用。别人实现的DLL放在我的目录下即可。我疑问的是我不引用别人的头文件,也可以动态调用吗?
我的想法是我提供界面开发平台,别人继承我的基类,实现,我只负责调用控件。不知道能否行得通,做个简单的DEMO测试下了。
gibsonboy 2011-09-06
  • 打赏
  • 举报
回复
其实你提供的也只是一个接口,将你的实现给封装起来,做成dll,然后只提供接口给厂家调用就是。注意基类的实现和接口是分开的(你当然不希望厂家看到你的实现吧)。这方面你要看一下ATL或者COM方面的知识。
oyljerry 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 zpingy 的回复:]
我要做一个基类(比如视频控件),定义好虚方法,在显示画面(窗体中)动态的创建此控件,使用相同的方法比如:Init(),Start(),Stop()。
此基类作为开发包提供给别人,别人如果使用的厂家不同,要写新的视频子类(控件),只能够从我的基类继承,具体在窗体中引用不能改写了,都是我定义好的。
在此我就有点疑惑,如果我的程序中不引用别人的子类,能够根据他们的子类名称来动态创建对象吗?
---……
[/Quote]
定义好基类,其他人如果有不同的行为,就需要在Init Start, Stop等中实现自己的行为,然后你调用基类的指针就好了,多态就可以达到调用别人开发的行为
  • 打赏
  • 举报
回复
帮你顶下

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧