我在python中尝试了一点OOP,同时在数据结构上做功课,并且在理解如何纠正继承某些方法和纠正方面遇到了一些麻烦。正确的方式继承方法1更正
所以,我有:
class BinarySearchTree(object):
# snipped
def _insert(self, key, val):
prevNode = None
currentNode = self.root
while currentNode:
prevNode = currentNode
if key < currentNode.key:
currentNode = currentNode.leftChild
else:
currentNode = currentNode.rightChild
if key < prevNode.key:
prevNode.leftChild = self.Node(key, val, parent=prevNode)
self.updateNodeProperties(prevNode.leftChild)
else:
prevNode.rightChild = self.Node(key, val, parent=prevNode)
self.updateNodeProperties(prevNode.rightChild)
# snipped
和:
class RBTree(BinarySearchTree):
# snipped
def _insert(self, key, val):
prevNode = None
currentNode = self.root
while currentNode:
prevNode = currentNode
prevNode.size += 1 # The only difference is in this line
if key < currentNode.key:
currentNode = currentNode.leftChild
else:
currentNode = currentNode.rightChild
if key < prevNode.key:
prevNode.leftChild = self.Node(key, val, parent=prevNode)
self.updateNodeProperties(prevNode.leftChild)
else:
prevNode.rightChild = self.Node(key, val, parent=prevNode)
self.updateNodeProperties(prevNode.rightChild)
# snipped
而且有我的问题:有没有继承这个方法,而不复制整个意识到这1个差异(prevNode.size += 1
)聪明的办法继承的功能代码?
小姐:抱歉我的英语不好。
UPD:现在我不能斯科特和CAB的解决方案之间进行选择...
否这是您将如何使用去做吧。如果你只修改一次节点,那将是一回事,但是因为它是循环的,所以你必须重新实现这个方法。 –
你可以拥有'prevNode.size + = self.something'并且适当的设置(默认为'0')。 – jonrsharpe
对于[关注点分离](https://en.wikipedia.org/wiki/Separation_of_concerns),您的树类中的代码应该管理树,而不是在节点本身中摆弄。访问者设计模式是一个很好的方法。 – CAB