分享下Object Oriented Programming

b42b82

53 回覆
41 Like 4 Dislike
b42b82 2021-07-31 13:35:09
有錯請指正.
咁岩學緊C++ 寫緊Dead Space.
寫Game就等係要有武器啦. 咁槍有好多種 有釘槍, 電鋸槍, 話知你咩槍都好.
Dead Space最出名就係 Plasma Cutter, Saw Gun.


咁我就用C++ 寫左呢兩支做Example


1. Class, Object, Polymorphism
話知你咩槍. 好多method, attribute 都一定有既
E.g.: 開槍, reload function.
E.g. Damage, WeaponName
Class Diagram.

而WeaponBase就係一個"Blueprint" 寫晒每支槍應該有既attribute and function.
Plasma Cutter, Saw Gun.(Object) 可以Extends from WeaponBase (Class)
同時實現Dynamic polymorphism.
因為兩把槍 射既子彈係唔一樣. Plasma Cutter射電漿, Saw Gun射把鋸出黎.
2者都可以Override existing class OpenFire();
就算第時加把Plasma Rifle, Line Gun.
OpenFire() 都可以reuse function from plasma cutter .
可以減少多餘既Code. 加減野都可以直接從WeaponBase Class. 唔會出現"改少少就仆直".

其它轉頭再講
木廠仔 2021-07-31 13:37:11
留名
黃世澤評論係戇鳩 2021-07-31 13:37:47
留名
魔貫光殺砲 2021-07-31 13:39:40
Lm
舒拉寶蛙 2021-07-31 13:44:21
Lm
際遇差窮三代IT狗 2021-07-31 13:53:52
如果純粹係數值上嘅唔同,咁其實係咪喺 constructor 入 reloadTime 嗰堆 properties?

好似除咗 fire() 之外,多幾個 class 好似冇乜意義

其實我都唔知,純討論吓

即係咁
class Weapon {
  reloadTime: number;
  constructor (reloadTime: number) {
    this.reloadTime = reloadTime;
  }
  // ...
}

const on9Gun = new Weapon(9999)
const godGun = new Weapon(0)

[on9Gun, godGun].forEach(weapon => weapon.fire())
b42b82 2021-07-31 14:00:52
數值上唔同 直接constructor入都可以.
b42b82 2021-07-31 14:02:44
地盤綠帽版Issac Clark.
際遇差窮三代IT狗 2021-07-31 14:09:27
如果係 GTA 嗰隻可以手動引爆嘅炸彈你會點整?

佢算唔算係 extends WeaponBase?

引爆器冇 reloadTime 好似,同埋冇 ammos

炸彈都冇 reloadTime,但有 ammos

其實諗諗吓都可以好撚複雜#it2#do
b42b82 2021-07-31 14:17:52
可以用 Multiple-inheritence
WeaponBase->ExplosiveClass->C4/Molotov/RemoteBomb Class
WeaponBase->GunClass->M4/AK47/M249.
寫game不嬲好複雜.
個人覺得同Java CRUD Business Domain Logic 有過之而無不及.
GTA仲要加埋Multi-player, network replication.
唔係得單機.
Fiat666 2021-07-31 14:19:15
留名
b42b82 2021-07-31 14:25:59
Java CRUD打雜
springlala 2021-07-31 15:25:01
返工 java 為搵食, 放工C++ 為興趣 ...
髀加蕉 2021-07-31 17:05:59
樓主好波
支持樓主
雲加爺爺 2021-07-31 17:09:07
想問下個diagram係用咩software畫?
有冇啲用黎做planning or table 嘅好software推介?
(有google過用過一啲 software 不過用落都係覺得唔太就手)
信者得救 2021-07-31 17:38:29
香港做crud,邊會同你拆到咁細
有新野直接起個新class,仲同你inheritance咩
b42b82 2021-07-31 18:10:11
encapsulation無咩特別
都係private, protected, public, getter setter 果咋野.
做到Data hiding, 防止data misuse.

如果expose晒出去 變左global variable好容易出事.
class Enemy {
public String name;
public int hp;
public boolean isDead;
}

// Some code in outer world
Enemy enemy = new Enemy();
enemy.hp = -999;

有bug既話會好難trace.
有時setter可以做埋validation.
class Enemy {
private String name;
public int hp;
public boolean isDead

public void setHp(int hp) {
   if (hp<0) {
      throw IllegalArgumentException("HP must be bigger then 0");
   }
   this.hp = hp;
}
}
b42b82 2021-07-31 18:11:54
聽過, 但無用過.
劉偉強 2021-08-01 02:40:51
好奶凍 2021-08-01 07:17:07
如果你要n 個地方去用呢個weapon. 咁你要make sure 你n把on9gun 係一定9999 reload time.唔會突然有把係9998.

我諗做法一係好似樓主咁做child class, 一係有個constant mapping file 去store 呢d config. 一係有個weapon builder class 去負責呢d config.
AmandaSeyfreid 2021-08-01 11:15:22
Override existing class OpenFire()
呢個可唔可以講多啲,姐係可以加啲class無身無嘅attribute?
即使要加把新槍都唔使跟足class嘅attribute?
吹水台自選台熱 門最 新手機台時事台政事台World體育台娛樂台動漫台Apps台遊戲台影視台講故台健康台感情台家庭台潮流台美容台上班台財經台房屋台飲食台旅遊台學術台校園台汽車台音樂台創意台硬件台電器台攝影台玩具台寵物台軟件台活動台電訊台直播台站務台黑 洞