gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:19 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com