上一篇中Star類的強(qiáng)大之處大家都看到了授药,今天我們繼續(xù)來通過這個(gè)項(xiàng)目展示一下面向?qū)ο蟮牧硪粋€(gè)強(qiáng)大之處——繼承悔叽。
代碼復(fù)用準(zhǔn)備
一提到代碼復(fù)用娇澎,我又要提之前總說的“高內(nèi)聚趟庄,低耦合”了。這個(gè)原則要求我們盡量讓每個(gè)函數(shù)只實(shí)現(xiàn)最小顆粒度的功能勒极。
我們看看上一篇中的Star類辱匿,Move()函數(shù)貌似調(diào)用頻率非常高。雖然代碼量不多匾七,但仔細(xì)想想昨忆,它可以分成三個(gè)功能:
- 擦除之前的星星
- 計(jì)算新位置
- 畫出新星星
按照這個(gè)功能劃分邑贴,我們將Star類的代碼修改如下:
class Star
{
public:
Star(){}
~Star(){}
void Init();
void Move();
protected:
void Draw();
void NewPos();
void Remove();
double m_x = 0;
int m_y;
double m_step;
int m_color;
};
void Star::Init()
{
if (m_x == 0)
{
m_x = rand() % SCREEN_WIDTH;
}
else
{
m_x = 0;
}
m_y = rand() % SCREEN_HEIGHT;
m_step = (rand() % 5000) / 1000.0 + 1;
m_color = (int)(m_step * 255 / 6.0 + 0.5); // 速度越快叔磷,顏色越亮
m_color = RGB(m_color, m_color, m_color);
}
void Star::Move()
{
Remove();
NewPos();
Draw();
}
void Star::Draw()
{
putpixel((int)m_x, m_y, m_color);
}
void Star::NewPos()
{
m_x += m_step;
if (m_x > SCREEN_WIDTH)
this->Init();
}
void Star::Remove()
{
putpixel((int)m_x, m_y, 0);
}
新加入了三個(gè)protected函數(shù)改基,Draw、Remove和NewPos分別負(fù)責(zé)將“自己”畫在屏幕上秕狰、從屏幕上刪除和計(jì)算出新位置鸣哀。
這三個(gè)函數(shù)代碼都不多,獨(dú)立成一個(gè)函數(shù)是不是有些多余呢鳖昌?新加函數(shù)后代碼總行數(shù)變得更多了。這個(gè)問題大家先自己思考一下懂盐,我們馬上就能看到它的好處了糕档。
不一樣的星星
假如你是一名程序員速那,完成上面的代碼之后突然接到這樣的需求變更:“現(xiàn)在的星星有些小,需要改大一點(diǎn)捶惜±笊眨”這時(shí),你該怎么改呢踊餐?
代碼修改有個(gè)原則吝岭,在越封閉的區(qū)域內(nèi)修改代碼越安全吧寺。如果在上一篇,我們需要在Move()函數(shù)中修改一些代碼才能實(shí)現(xiàn)這個(gè)功能微峰,而現(xiàn)在我們只要修改Draw()和Remove()兩個(gè)函數(shù)就好了。修改如下:
void Star::Draw()
{
putpixel((int)m_x, m_y, m_color);
setcolor(m_color);
circle(m_x, m_y, 1);
}
void Star::Remove()
{
putpixel((int)m_x, m_y, 0);
setcolor(0);
circle(m_x, m_y, 1);
}
最重要的是谋币,即使你修改時(shí)寫錯(cuò)了代碼症概,也不會(huì)影響Move()函數(shù)。這兩個(gè)函數(shù)讓畫圖和計(jì)算位置兩部分代碼徹底隔離開了诅蝶。
如果你覺得這樣很神奇,那么告訴你语盈,這才剛剛是個(gè)開始刀荒。
星星的繼承
接下來棘钞,需求又變了宜猜。需要在程序中加入另外一種矩形的星星。哪有什么矩形的星星呢符隙?告訴你垫毙,程序員經(jīng)常接到這種毫無道理的需求變更综芥。還是想想如何實(shí)現(xiàn)吧。
首先膀藐,現(xiàn)有的代碼都是有用的额各,要保留。同時(shí)虾啦,需要新加入矩形星星的類傲醉。是不是有人覺得是這樣呢硬毕?
class RectStar
{
public:
Star(){}
~Star(){}
void Init();
void Move();
protected:
void Draw();
void NewPos();
void Remove();
double m_x = 0;
int m_y;
double m_step;
int m_color;
};
再寫一個(gè)RectStar類肯定是沒問題的,但我們發(fā)現(xiàn)逻悠,這個(gè)類中的大部分代碼和Star類完全一樣。在后面實(shí)現(xiàn)的時(shí)候单旁,Init()和Move()兩個(gè)函數(shù)也不用修改慎恒,這樣完全相同的兩份代碼不僅浪費(fèi)融柬,而且造成后期維護(hù)負(fù)擔(dān)粒氧。
正確的方法其實(shí)是這樣的节腐,讓RectStar類從Star類中繼承翼雀。代碼如下:
class RectStar : public Star
{
public:
RectStar(){}
~RectStar(){}
void Move()
{
Remove();
NewPos();
Draw();
}
protected:
void Draw();
void Remove();
};
void RectStar::Draw()
{
setfillcolor(m_color);
fillrectangle(m_x, m_y, m_x + 3, m_y + 3);
}
void RectStar::Remove()
{
clearrectangle(m_x, m_y, m_x + 4, m_y + 3);
}
這樣狼渊,新的矩形星星就完成了狈邑。
我們再把main函數(shù)做些修改如下:
void main()
{
srand((unsigned)time(NULL));
initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);
Star star[MAXSTAR];
RectStar rstar[MAXSTAR];
for (int i = 0; i < MAXSTAR; i++)
{
star[i].Init();
rstar[i].Init();
}
while (!kbhit())
{
for (int i = 0; i < MAXSTAR; i++)
{
star[i].Move();
rstar[i].Move();
}
Sleep(50);
}
closegraph();
}
好了,現(xiàn)在我們的程序中就會(huì)多出一些奇怪的矩形星星糕伐。哎呀良瞧,矩形的星星真的好難看亏较。
不過雪情,用繼承來實(shí)現(xiàn)這個(gè)功能真的很炫你辣,不是嗎尘执?
我是天花板誊锭,讓我們一起在軟件開發(fā)中自我迭代丧靡。
如有任何問題温治,歡迎與我聯(lián)系熬荆。
上一篇:C++代碼訓(xùn)練營 | 繪制星空
下一篇:C++代碼訓(xùn)練營 | 多樣的星空
- 文/潘曉璐 我一進(jìn)店門鼓鲁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人欠动,你說我怎么就攤上這事。” “怎么了具伍?”我有些...
- 文/不壞的土叔 我叫張陵翅雏,是天一觀的道長。 經(jīng)常有香客問我人芽,道長望几,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任萤厅,我火速辦了婚禮橄抹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己慌随,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布捎谨。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪臂寝。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匹颤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
- 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡焰情,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炒俱。...
- 正文 年R本政府宣布米酬,位于F島的核電站跳芳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一瘩将、第九天 我趴在偏房一處隱蔽的房頂上張望姿现。 院中可真熱鬧,春花似錦荤崇、人聲如沸术荤。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至夕春,卻和暖如春倚搬,著一層夾襖步出監(jiān)牢的瞬間靖避,已是汗流浹背潭枣。 一陣腳步聲響...
- 正文 我出身青樓命咐,卻偏偏與公主長得像篡九,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子醋奠,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
- 前兩篇中榛臼,我們分別介紹了面向?qū)ο蟮姆庋b和繼承兩個(gè)特性,今天我們來說最后一個(gè)特性:多態(tài)窜司。 什么是多態(tài) 用一句話來概括...
- 是不是很炫沛善,不過我們今天要用C++繪制的不是上面這幅,而是下面這幅塞祈。注意金刁,是動(dòng)態(tài)的哦。 在今天之前议薪,你能想象用C+...
- 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫尤蛮、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...