c++ - 交互类 - 组织代码

标签 c++ design-patterns inheritance polymorphism

我在正确组织类(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)

如何组织新类的代码来提供这些功能?

  1. 没有代码重复,我想使用已经创建的 Car 和 Station 类方法。
  2. 快速转换 Truck& -> Car&、TruckStation& -> Station&(不需要继承,组合也适用),因为有时我想将 Truck 视为 Car,将 TruckStation 视为 Station。
  3. 级别 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*.
}

重复问题:我如何实现这些类来提供:

  1. 没有代码重复。
  2. 可以将新类视为更高级别的抽象。
  3. TruckStation::GetMutableTruckPointer() 等 Station::GetMutableCarPointer() 对应的实现方法。

谢谢!

最佳答案

具体到您的代码。我会这样做。

  1. 基础类 Vehicle 通过 Car 和 Truck 的特定类进行扩展。
  2. 类站与方法
    • void Station::AddVehicleToPlaceNumberN(const Vehicle& vehicle, int placeNumber)
    • Vehicle* Station::GetMutableVehiclePointer()

设计/类(class)组织背后的原因。 1. 只有在需要不同的实现时才使用继承。如果继承方法的不同实现做同样的事情(比如 AddVehicleToPlaceNumberN),那么就不需要分离实现。 2. 使用泛型方法名总是有助于简化代码。这些方法可以被重载(传递不同数量和类型的参数)以完成特定的事情。

关于c++ - 交互类 - 组织代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3307234/

相关文章:

C++ 从基类继承构造函数

design-patterns - 如何解释具有复杂限制的操作失败

design-patterns - 使用状态模式的对象应该如何转换到下一个状态?

css - 防止元素受外部 css 影响的完美方法

c++ - 编译器找不到在基类中实现的虚函数

c++ - 从 exe 中检索资源文​​件

c++ - 使用 libproc 在 C++ 中查找 CPU 利用率

c++ - 在 Linux for Windows 上构建应用程序

c# - 如何修复其根类需要装饰器实例的装饰器?

Java继承-调用父类(super class)方法