如果其中一个方法在子 class 中有覆盖,C++ 是否有办法强制覆盖一组方法?
C++ is there a way to force a set of methods to be overriden, if one of them have an override in child class?
这是一个设计问题。
所以,我得到了一个带有很多纯虚方法的抽象class。有时,我意识到我不需要重写这些方法,因为我对这些功能不感兴趣。所以我从纯虚(=0)变成了一个简单的可重写的空方法。但是现在,子 class 可以覆盖一个方法,但不能覆盖与之相关的另一个方法。这可能会导致问题...有没有一种很好的方法可以强制编译器说 "if you override this method, you should override this one too !" ?
一个简单的解决方案是保留抽象 class 并有一个默认子 class,如下所示:
class AbstractMap<TKey, TValue> {
public:
virtual TValue Get(TKey&& key) = 0;
virtual bool TryGet(TKey&& key, TValue& result) = 0;
};
class PartiallyImplementedMap<TKey, TValue> : public AbstractMap<TKey, TValue> {
public:
TValue Get(TKey&& key) override {
TValue result;
if (TryGet(std::forward<TKey>(key), result)) {
return result;
}
throw KeyNotFoundException();
};
};
现在您可以从 PartiallyImplementedMap
继承并且仅在默认实现满足您的情况下才实现 TryGet
。否则你可以从 AbstractMap
继承并实现整个东西。
使用混合 类。
您可以使用混合 类 来采用相关方法集的实现。在此处阅读有关混合的信息(即使这是一个 Python 问题):
What is a mixin, and why are they useful?
您在以下情况下使用混音...
- You want to provide a lot of optional features for a class.
- You want to use one particular feature in a lot of different classes.
这正是你的情况。所以,也许是这样的:
class Person { /* ... */ } ;
template <transportation_t MeansOfTransport>
class GetsAroundBy: Person { /* ... */ };
template <domicile_kind_t DomicileKind>
class LivesIn : Person { /* ... */ };
class Urbanite : Person, LivesIn<ApartmentBuilding>, GetsAroundBy<Metro> { /* ... */ };
class SteppePerson : Person, LivesIn<Yurt>, GetsAroundBy<Horse> { /* ... */ };
这是一个设计问题。 所以,我得到了一个带有很多纯虚方法的抽象class。有时,我意识到我不需要重写这些方法,因为我对这些功能不感兴趣。所以我从纯虚(=0)变成了一个简单的可重写的空方法。但是现在,子 class 可以覆盖一个方法,但不能覆盖与之相关的另一个方法。这可能会导致问题...有没有一种很好的方法可以强制编译器说 "if you override this method, you should override this one too !" ?
一个简单的解决方案是保留抽象 class 并有一个默认子 class,如下所示:
class AbstractMap<TKey, TValue> {
public:
virtual TValue Get(TKey&& key) = 0;
virtual bool TryGet(TKey&& key, TValue& result) = 0;
};
class PartiallyImplementedMap<TKey, TValue> : public AbstractMap<TKey, TValue> {
public:
TValue Get(TKey&& key) override {
TValue result;
if (TryGet(std::forward<TKey>(key), result)) {
return result;
}
throw KeyNotFoundException();
};
};
现在您可以从 PartiallyImplementedMap
继承并且仅在默认实现满足您的情况下才实现 TryGet
。否则你可以从 AbstractMap
继承并实现整个东西。
使用混合 类。
您可以使用混合 类 来采用相关方法集的实现。在此处阅读有关混合的信息(即使这是一个 Python 问题):
What is a mixin, and why are they useful?
您在以下情况下使用混音...
- You want to provide a lot of optional features for a class.
- You want to use one particular feature in a lot of different classes.
这正是你的情况。所以,也许是这样的:
class Person { /* ... */ } ;
template <transportation_t MeansOfTransport>
class GetsAroundBy: Person { /* ... */ };
template <domicile_kind_t DomicileKind>
class LivesIn : Person { /* ... */ };
class Urbanite : Person, LivesIn<ApartmentBuilding>, GetsAroundBy<Metro> { /* ... */ };
class SteppePerson : Person, LivesIn<Yurt>, GetsAroundBy<Horse> { /* ... */ };