Собственно суть проблемы (принцип подстановки Барбары Лисков) в ООП. http://ru.wikipedia.org/wiki/Принцип_подстановки_Барбары_Лисков
Для труЪ объясняю на примере, который калька википедийного, но только на питоне, потому как он меня больше интересует. Допустим у нас есть класс Прямоугольник и класс-наследник Квадрат.
class Rectangle():
def __init__(self, width, height):
self.width = width
self.height = height
def perimeter(self):
return 2*(self.width + self.height)
def area(self):
return self.width * self.height
def print(self):
print "Rectangle ", self.height, self.width
class Square(Rectangle):
def __init__(self, size):
self.set_side(size)
def set_side(size):
self.width = size
self.height = size
def print(self):
print "Square ", self.width
s = Square()
s.set_size(5)
s.set_height(10)
Решить эту проблему по-настоящему может динамическое изменение класса объекта, тогда принцип подстановки выполняется. Должно выглядеть это так:
s = Square()
s.set_size(5)
s.print() # Square 5
s.set_height(10) # here we change s class from Square to Rectangle
s.print() # Rectangle 10 5
s.set_width(10) # here class of s change from Rectangle to Square
s.print() # Square 10
<holywar_mode>
На CLOS (Common Lisp) это реализуется более чем просто - там есть change-class.
</holywar_mode>