作者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
1F:→ legnaleurc:想成 tree 就不会太复杂了 06/25 14:16
2F:→ adrianshum:所谓 tree 就是我所谓 composite-like 的做法了 06/25 16:38