全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1302
推到 Plurk!
推到 Facebook!

class的繼承與組合問題

缺席
brian_chen
一般會員


發表:14
回覆:20
積分:6
註冊:2007-06-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-07-24 13:08:32 IP:59.120.xxx.xxx 訂閱
在c 的書上看到有關繼承與成員函數的擴充功能
但有一些問題

class library_object
{
protected:
char name[30];
long index;
public:
void set_data (const char *i_name)
{
.....
strcpy(name,i_name);
index = 1;

}
};

使用取代功能 (不符合程式碼再用的精神)
這應該比較適用於當book.set_data內程式碼完全不同的時候
class Book : public libary_object
{
private:
bool on_shelf;
public:
void set_data(const char* name)
{
.....
strcpy(name,i_name);
index = 1;

on_shelf = true;
}
};


使用擴充功能 (符合程式碼在用的精神,當大部份的程式碼都相同時)
class Book : public libary_object
{
private:
bool on_shelf;
public:
void set_data(const char* name)
{
library_object::set_data(i_name); //呼叫父class的set_data
on_shelf = true; //多增加的部份
}
};

問題來了,如果有另一個Book2及book3的class如下
class Book2 : public libary_object
{
private:
bool on_shelf;
public:
void set_data(const char* iname)
{
.....
strcpy(name,i_name);

doSomeThing();
index = 1;
}
};

class Book3 : public libary_object
{
private:
bool on_shelf;
public:
void set_data(const char* iname)
{
.....
strcpy(name,i_name);

doOtherThing();
index = 1;
}
};

比如說 doSomeThing() / doOtherThing() 一定要放在 index = 1 前面....
這樣子,要如何利用擴充功能改寫set_data以符合程式碼的reuse...
還是只能使用取代功能重新寫book2.set_data這個function

--------------------------
因為想儘量增加程式碼的reuse
所以想到,如果一大段程式碼都相同,但中間必需要插入一段判斷式或是參數設定時
要如何不用再去寫一大段相同的程式碼....
書上寫的我懂,但好像只限於子class的新增部份只能插在前方或後方(以不更動父class中的function為主)
編輯記錄
brian_chen 重新編輯於 2007-07-24 16:40:17, 註解 無‧
brian_chen
一般會員


發表:14
回覆:20
積分:6
註冊:2007-06-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-07-26 21:21:12 IP:61.216.xxx.xxx 訂閱
放了幾天,都沒人回答,所以我自己大概回答好了...

在bbs上,有人提出了一個想法,我也覺得可行...(他說是template method pattern)
不過實做起來,好像會出現一些問題...

class base
{
public:
void function1(void)
{
dosomething //做一些初始宣告
....
..
function2();
dosomething2 //做之後的運算
}
virtual void function2(void) = 0;
}

class child : public base
{
public:
void function2(void)
{
for (int i=0; i < 100; i )
{
temp = temp i;
}
}
}

class child2 : public base
{
public:
void function2(void)
{
switch(...)
csae 1:...
.....
}
}


void main()
{
if(true)
{
child XXX;
XXX.function1();
}
else
{
child2 YYY;
YYY.function1();
}
}

正常來說,執行function的流程會是
dosomething -> child.function2 -> dosomething2 結束
dosomething -> child2.function2 -> dosomething2 結束

可是跑到中間那一步的時候
就會跳出記憶體錯誤的訊息....

這是目前所遇到的問題...



編輯記錄
brian_chen 重新編輯於 2007-07-26 21:21:40, 註解 無‧
brian_chen 重新編輯於 2007-07-26 21:21:58, 註解 無‧
系統時間:2024-05-02 21:19:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!