Хотя ответ Свена верен, что это проблема правил согласованности Rust, вы можете решить эту проблему, просто немного обобщив код. В общем, когда у вас есть два разных типа, которые должны иметь разное поведение, но похожий интерфейс, часто полезно создать для этого признак.
В этом случае вы можете создать признак для RealClock
и FakeClock
, который каждый может реализовать, и использовать это в вашей реализации generi c Clock
вместо добавления поведения каждого непосредственно:
// Common interface for RealClock and FakeClock, implemented separated for each
trait ClockImpl {
fn now() -> SystemTime;
}
impl ClockImpl for RealClock {
fn now() -> SystemTime {
SystemTime::now()
}
}
impl ClockImpl for FakeClock {
fn now() -> SystemTime {
UNIX_EPOCH
}
}
// MixInClock only needs to now that Self::Impl implements ClockImpl
trait MixInClock {
type Impl: ClockImpl;
}
// We call the T::Impl::now() method for the specific behavior of RealClock and FakeClock
impl<T: MixInClock> Clock for T {
fn now(&self) -> SystemTime {
<T::Impl as ClockImpl>::now()
}
}
Код на площадке