作者adrianshum (Alien)
看板C_and_CPP
標題Re: [問題] 物件內的物件...彼此溝通的方法?
時間Thu Jun 25 12:37:14 2009
把地球一層一層傳進去是正常做法之一.
另外, 每一層都提供取得上一層, 也是正常做法
之一
(唯一不建議的是 global/singleton)
"取得上一層" 的做法要怎麼做, 也要視乎你的設計而定.
要是你的設計, Planet, Country, City 都是很 concrete
的 class, 那麼一般都會這樣寫:
class Planet {
private:
vector<Country> countries;
}
class Country {
private:
Planet& planet;
vector<City> cities;
}
class City {
private:
Country& country;
vector<People> peoples;
}
class People {
private:
City& city;
}
在 People 要存取 planet, 當然是寫
getCity().getCountry().getPlanet().getTemperature() 了
但一般這類層次性的關係, 比較少會特別拿 Planet 的獨有
method. 這類情況, 會用類似 Composite 的設計:
有一 abstract class 是 Region, 裡面有 parent Region 的
ref (也可以有 enclosing Regions), 也有 getTemperature()
abstract class Region {
private:
Region* parentRegion;
vector<Region> enclosingRegions;
int getTemperature() {
if (myTemperature != null) {
return myTemperature;
} else if (parentRegion == null) { // I am the top
return 0;
} else {
return parentRegion->getTemperature();
}
}
}
Planet, Country, District 可以是 Region 的 concrete class,
或者是某種 concrete class 的 instance.
People 可以位處任何 Region. 通常這類情況, 也只會 concern 我
身處的 region 的氣溫. 很少會需要取得最高層的氣溫 (就算有, 也
可以弄一個 getPlanetTemperature(), 類似上面的 getTemperature,
只是自己不是 planet 的話就問上層, 直到是 planet 的一層就回報自
己氣溫.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.155.236.82
→ legnaleurc:想成 tree 就不會太複雜了 06/25 14:16
→ adrianshum:所謂 tree 就是我所謂 composite-like 的做法了 06/25 16:38