我在正确组织类(class)方面遇到了一些问题。
假设,我有一些 ABase 类。当我想创建此类的一些不同的(更具体的)抽象(将其表示为 AParticular)时,我可以使用继承或仅使用组合。然后很容易将 AParticular 视为 ABase:在继承的情况下它是自动生成的,在组合的情况下我可以创建一些 const ABase& AParticular::GetABasePart()
方法。通过这种方式,我避免了代码重复并获得了多态特性。
但是,当我有两个或多个相互交互的类时,在更具体的抽象中创建这些类的类似物时会遇到一些问题。 例如,假设我有两个类 Car 和 Station。车站有一些公共(public)的养车方法:
class Car {
...
}
class Station {
...
void AddCarToPlaceNumberN(const Car& car, int place_number) {
// adds car to some_container<Car>.
}
Car* GetMutableCarPointer(int place_number) {
// gets mutable pointer from some_container<Car>.
}
...
some_container<Car> cars;
}
现在,我想创建 Truck 和 TruckStation 类:它们与 Car 和 Station 类非常相似,并且有细微的变化。要理解问题就足够了,因为它们与 Car 和 Station 类完全相同,但它们的方法有一点不同的名称(即 TruckStation::AddTruckToPlaceNumberN 而不是 Station::AddCarToPlaceNumberN)
如何组织新类的代码来提供这些功能?
- 没有代码重复,我想使用已经创建的 Car 和 Station 类方法。
- 快速转换 Truck& -> Car&、TruckStation& -> Station&(不需要继承,组合也适用),因为有时我想将 Truck 视为 Car,将 TruckStation 视为 Station。
- 级别 Car-Station 中的所有交互方法都应在新级别 Truck-TruckStation 中实现。
主要问题是 3d 项目。让我们考虑两种交互方法:
1)用这个方法就可以了:
// If we use inheritance in creating Truck and TruckStation, then we just run
void TruckStation::AddTruckToPlaceNumberN(const Truck& car, int place_number) {
AddCarToPlaceNumberN(car, place_number)
}
// If we use composition, then it is appropriate to run sth like that:
void TruckStation::AddTruckToPlaceNumberN(const Truck& car, int place_number) {
station_.AddCarToPlaceNumberN(car.GetCarPart(), place_number);
}
2) 但我不知道如何实现 Station::GetMutableCarPointer() 的模拟:
// For example, if TruckStation was inherited from Station, then suppose:
Truck* TruckStation::GetMutableTruckPointer() {
Car* car = GetMutableCarPointer();
// Ups! I need to return Truck*, not Car*.
}
重复问题:我如何实现这些类来提供:
- 没有代码重复。
- 可以将新类视为更高级别的抽象。
- TruckStation::GetMutableTruckPointer() 等 Station::GetMutableCarPointer() 对应的实现方法。
谢谢!
最佳答案
具体到您的代码。我会这样做。
- 基础类 Vehicle 通过 Car 和 Truck 的特定类进行扩展。
- 类站与方法
void Station::AddVehicleToPlaceNumberN(const Vehicle& vehicle, int placeNumber)
Vehicle* Station::GetMutableVehiclePointer()
设计/类(class)组织背后的原因。 1. 只有在需要不同的实现时才使用继承。如果继承方法的不同实现做同样的事情(比如 AddVehicleToPlaceNumberN),那么就不需要分离实现。 2. 使用泛型方法名总是有助于简化代码。这些方法可以被重载(传递不同数量和类型的参数)以完成特定的事情。
关于c++ - 交互类 - 组织代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3307234/