游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7751|回复: 37

子类化代替实例化,获得真正的和谐

[复制链接]

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-10-4 09:46:00 | 显示全部楼层 |阅读模式
Q 什么是子类化?

A 如果你一点都不知道,就先找个会的人问问,再来。如果你大致知道就很好。

我先举个实例化的例子:

struct Interger
{
private:
    int m_value;
public:
    Interger(int val) : m_value(val) {}
    int get_Value()const { return m_value; }
};

Interger * pMyIntA = new Interger(5);

Function111( pMyIntA );
Function222( pMyIntA );

这里我非常担心,Function111和Function222的执行顺序......

同样的功能,可以用子类化这样写(虽然C++的书写比较多,请忍受):

struct Interger
{
protected:
    ~virtual Interger() {}
public:
    virtual get_Value() const = 0;
};

struct MyIntA : Interger
{
public:
    virtual ~MyIntA() {}
public:
    virtual get_Value() const { return 5; } // override
}

Function111( MyIntA() );
Function222( MyIntA() );

这样做的好处是:
可以在需要的时刻,在计算机的内存中实际地创建 MyIntA 的内存区域。抑制了可变值的使用,而全面采用函数,从而不用担心执行过程,特别是在多任务并行的编程中,轻而易举地获得稳定和可靠。
比如我可以写:

Function222( MyIntA() );
Function111( MyIntA() );

而根本不用担心,MyIntA 的数值的正确性!?

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2008-10-4 12:42:00 | 显示全部楼层

Re:子类化代替实例化,获得真正的和谐

我想问一下,在后一种写法里,如果把Function111和Function222对调后会怎样?在前一种写法里对调会怎样?

9

主题

249

帖子

260

积分

中级会员

Rank: 3Rank: 3

积分
260
发表于 2008-10-4 13:20:00 | 显示全部楼层

Re:子类化代替实例化,获得真正的和谐

这个问题比较高深艾,真是一头雾水,不知所云!

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-10-4 13:26:00 | 显示全部楼层

Re:子类化代替实例化,获得真正的和谐

现在流行通过override来安全地实现回调,实际上也是我今天说的好处之一。

实际上在函数型编程中,没有办法修改该一个数值,所以,对类库的再利用,
必须采用override,即重写一个函数。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-10-4 13:28:00 | 显示全部楼层

Re: Re:子类化代替实例化,获得真正的和谐

sjinny: Re:子类化代替实例化,获得真正的和谐

我想问一下,在后一种写法里,如果把Function111和Function222对调后会怎样?在前一种写法里对调会怎样?


不要钻牛角尖。我是用例子简单概括通常编程中遇到的一些现象(可变值的不安全性)
我又没明确定义Function111,222,你只要知道大概意思即可。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2008-10-4 13:36:00 | 显示全部楼层

Re:子类化代替实例化,获得真正的和谐

这里我非常担心,Function111和Function222的执行顺序......

这句话似乎暗示了下面的内容可以让你不需要担心执行顺序,但是下面的代码里似乎执行顺序的确保与上面没啥区别,所以看不懂……

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-10-4 13:48:00 | 显示全部楼层

Re: Re:子类化代替实例化,获得真正的和谐

sjinny: Re:子类化代替实例化,获得真正的和谐


这句话似乎暗示了下面的内容可以让你不需要担心执行顺序,但是下面的代码里似乎执行顺序的确保与上面没啥区别,所以看不懂……


我不是关心,Function111和Funtion222的调用顺序,而是说,
MyIntA 和调用顺序无关。

你可能说,我用 const 就可以保证安全了,
我想问:程序中的数量,都是不变的吗?

我这里作为一个例子,对于 get_value 直接返回了 5 (常函数),
但你不一定要用常函数。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-10-4 14:03:00 | 显示全部楼层

Re:子类化代替实例化,获得真正的和谐

你还记得《面向对象带来的的陷阱》吗?

其中提到的数值同步问题,我现在用 2 个变量来处理。
而且我还提供了 Pulse<T> 模板,处理不连续的量。
但是这些操作,都是在 手 工 用变量去做,麻烦,不安全,难移植。
----你必须控制如何实现一个运动方程如 s = v * t ,如何安全地计算
(用了2个值的设计模式后,bug的确减少了90%以上,但仍然很底层)

真正避免bug,需要避免用过程和变量,而采用函数,那就意味着----没有办法用实例,只能用子类

而对于logic代码, 跨 平 台 ,不是应该是这样:
为不同平台实现一个VirtualMachine,它可以一步一步做各种计算,可以用变量存储数值。
----速度慢不说,编程工作仍然没有本质变化(Virtual CPU 和 物理CPU 在软件角度看,有多大区别呢?)----编写优秀的仿真代码仍然需要程序员的刻苦钻研。
图解为:

数学规律和剧本 --> 过程式代码操纵某某CPU --> 各种平台

正确的跨平台应该是:
在不同的平台上,提供编译器和运行库,它们可以仿真一些函数式子(函数式),和一些剧本(过程式)。
图解为:

数学规律和剧本 --> 各种平台

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2008-10-4 15:48:00 | 显示全部楼层

Re:子类化代替实例化,获得真正的和谐

汗……别扯那么多,越多我越看不明白……
你就用一句话说明问题的核心,再用一句话说明解决办法的本质……

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-10-4 16:14:00 | 显示全部楼层

Re: Re:子类化代替实例化,获得真正的和谐

sjinny: Re:子类化代替实例化,获得真正的和谐

汗……别扯那么多,越多我越看不明白……
你就用一句话说明问题的核心,再用一句话说明解决办法的本质……


问题核心:过程式编程 (过程式应该去写剧本和状态机)
解决方法:函数式编程,但剧本和状态机要用过程式(不少C++程序员用函数式写状态机)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-21 03:57

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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