游戏开发论坛

 找回密码
 立即注册
搜索
楼主: akima

请问我应该如何设计我的代码接口

[复制链接]

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20468
发表于 2013-12-3 00:11:58 | 显示全部楼层
akima 发表于 2013-12-3 00:06
sea_bug 前辈,我再举一个例子吧,这样子的问题我发现自己遇到好多了:

// 文件接口

zip没有write,但是应该会有类似写入压缩包的功能,

你的CZipFile:write() 里面就应该实现一套写入文件的操作。

比如 write里,可以是一串操作,不是对应接口。

5

主题

84

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
 楼主| 发表于 2013-12-3 00:13:28 | 显示全部楼层
sea_bug 发表于 2013-12-3 00:07
我也没做过类似中间件的抽象设计,只是针对你遇到的问题所思考的解决方案。 ...

是不是类似下面这样图呢 ?

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20468
发表于 2013-12-3 00:16:43 | 显示全部楼层
你的iImage应该就是所谓的中间件,它抽象了一套接口。

5

主题

84

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
 楼主| 发表于 2013-12-3 00:18:40 | 显示全部楼层
sea_bug 发表于 2013-12-3 00:11
zip没有write,但是应该会有类似写入压缩包的功能,

你的CZipFile:write() 里面就应该实现一套写入文件 ...

如果出现子类所无法实现的方法,怎么办呢 ?

今天 CZipFile::write( ) 我是解决了,明天肯定会出现 CMIDISound::set3DPos( ) 不能实现,大后天肯定会出现 CPythonScript::createTable( ) 不能实现 ...

总结起来,就是【子类退化了】,毕竟父类能做的,子类一定能做到,可是我这里,父类能做到,却出现了少数子类不能做到的情况 。

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20468
发表于 2013-12-3 00:24:16 | 显示全部楼层
我觉得你的派生类无法实现虚类的功能,可能是在于接口的设计层面有问题。

好比你设计的iImage,里面要用到3D模型的渲染方式,但里面的派生类GDIImage没办法做3D模型渲染,所以你的Render3DModuel(假设接口),在D3D和OpenGL下是可行的,但GDI就变成无效接口。

5

主题

84

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
 楼主| 发表于 2013-12-3 00:24:28 | 显示全部楼层
sea_bug 发表于 2013-12-2 22:57
我觉得你抽象得还不够,在遇到底层工作机制完全不同的情况下,你这样的接口可能就会面临一些结构上问题,比 ...

【我觉得你要抽象出来一个中间件接口,应该是按照你的机制来实现,然后不同的底层只是服务你机制的一种实现,而不是把底层的某种工作方式当作你的机制。】

这里我看懂了一点,您的意思是让 IImage 来服务 CD3D9Image、COpenGLImage 等,而不是让 CD3D9Image 、COpenGLImage 来服务 IImage 么 ?

也就是说,IImage 的设计,要考虑各种实现的能力范围,不要让 IImage 超出了实现层的能力么 ?

5

主题

84

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
 楼主| 发表于 2013-12-3 00:27:12 | 显示全部楼层
sea_bug 发表于 2013-12-3 00:24
我觉得你的派生类无法实现虚类的功能,可能是在于接口的设计层面有问题。

好比你设计的iImage,里面要用到 ...

对对对,问题就是这样了,不过我的 IImage 是一定要提供 3D 渲染功能的啊,如果为了包容 GDI 而去掉 3D 渲染功能,那么 D3D9 和 OpenGL 不就不能实现 3D 渲染了么 ?

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20468
发表于 2013-12-3 00:29:32 | 显示全部楼层
你的第二段我没看明白,不过第三段话差不多就是我的意思,不要让你的抽象接口实现过多跨越式的功能,那必然会导致你的接口会有很多实现不了的。

好比我们做个CZipFile去实现CD3DImage的功能,当然,这个说法比较极端,就是你做接口,一般是为了实现跨平台,但是你所希望的那些平台,应该都具有一些相同的特征,这样才有抽象通用接口的意义。

5

主题

84

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
 楼主| 发表于 2013-12-3 00:33:38 | 显示全部楼层
sea_bug 发表于 2013-12-3 00:29
你的第二段我没看明白,不过第三段话差不多就是我的意思,不要让你的抽象接口实现过多跨越式的功能,那必然 ...

你的意思我懂了,那这些子类不能实现的方法,有没有其它高雅一点的方法来弥补呢 ?
这样一来,我的 IFile 就只能提供 open( ) 方法了,那么 write( ) 方法又应该怎么实现呢 ?
同理,我的 IImage 就只能提供 render( ) 方法了,那么 createForRenderTarget( ) 方法又应该怎么实现呢 ?

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20468
发表于 2013-12-3 00:34:23 | 显示全部楼层
我以前的HOHO引擎是有开源,里面也有一部分用到了抽象接口,目的为了实现用3D硬件渲染2D图片,另外一种是支持CPU的渲染2D图片。你有兴趣可以看看,代码量应该比cocos2dx少很多。

里面CDisplay作为基类,iDisplay是纯虚类,

核心在于,

class CHardware2D : public CDisplay  

class CDirectDraw : public CDisplay  


CDisplay因为是服务2D图形,所以两种渲染方式都是支持的,不过代码是2005年的,我现在也记不大清楚了,但至少当初在设计的时候,就是为了实现这个目标,用户可以通过设定来选择使用硬件/软件渲染。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-26 05:30

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表