Mam klasy abstrakcyjnej z trzema metodami, które są równoważne sensie - wszystkie można zdefiniować w kategoriach nawzajem za pomocą drogich funkcji konwersji. Chcę móc napisać klasy pochodnej, która musiałaby tylko zastąpić jedną z metod i automatycznie uzyskać pozostałe dwa. PrzykładJak zdefiniować trzy metody cyklicznie?
class FooBarBaz(object):
def foo(self, x):
return foo_from_bar(self.bar(x))
# OR return foo_from_baz(self.baz(x))
def bar(self, x):
return bar_from_foo(self.foo(x))
# OR return bar_from_baz(self.baz(x))
def baz(self, x):
return baz_from_bar(self.bar(x))
# OR return baz_from_foo(self.foo(x))
class Derived1(FooBarBaz):
def bar(self, x):
return 5
# at this point foo = foo_from_bar(5) and
# baz = baz_from_bar(5), which is what I wanted
class Derived2(FooBarBaz):
def foo(self, x):
return 6
# at this point bar = bar_from_foo(6) and
# baz = baz_from_bar(bar_from_foo(6)),
# which is not ideal, but still works
class Derived3(FooBarBaz):
def baz(self, x):
return 7
# at this point foo and bar remain defined
# in terms of each other, which is a PROBLEM
Wiem, że mogę wyraźnie powiedzieć każdej pochodnej klasy, których konwersji użyć. Chcę wiedzieć, czy istnieje sposób, aby klasa rodzicielska mogła to samodzielnie rozwiązać, nie modyfikując dzieci.
Jak widać w poniższych odpowiedziach, decyzja, które podejście zastosować, zależy od tego, jak kosztowne są konwersje, a także czy masz tylko trzy alternatywy, czy może 20. Te ostatnie w połączeniu z unikaniem wielokrotnych konwersji w razie potrzeby dałoby mi niezłe ćwiczenie :-D. –