Come faccio a progettare una sottoclasse il cui metodo contraddice la sua superclasse? Diciamo che abbiamo questo esempio:
# Example 1
class Scissor
def right_handed?
true
end
end
class LeftHandedScissor < Scissor
def right_handed?
false
end
end
Supponiamo che l'ereditarietà sia necessaria in questo esempio, ad es. che potrebbero esserci altri metodi oltre a right_handed?
che vengono ereditati.
Quindi LeftHandedScissor è una forbice. Il suo metodo right_handed?
corrisponde al tipo di valore di firma e di ritorno del metodo della sua superclasse. Tuttavia, il metodo sottoclasse contraddice il valore restituito valore del metodo superclasse.
Questo mi infastidisce perché sembra una contraddizione logica:
- Tutte le forbici sono destrorse.
- Una forbice mancina è una forbice.
- Pertanto, una forbice mancina è destrorsa.
Ho preso in considerazione l'idea di introdurre un AbstractScissor per evitare questa contraddizione:
# Example 2
class AbstractScissor
def right_handed?
raise NotImplementedError
end
end
class RightHandedScissor < AbstractScissor
def right_handed?
true
end
end
class LeftHandedScissor < AbstractScissor
def right_handed?
false
end
end
Il mio collega dice che l'aspetto negativo di questa soluzione è che è più prolisso. Oltre ad aggiungere una classe in più, ci impone di chiamare le forbici "forbici per destrimani", che nessuno fa nel mondo reale.
Questo mi porta alla mia ultima soluzione:
# Example 3
class AbstractScissor
def right_handed?
raise NotImplementedError
end
end
class Scissor < AbstractScissor
def right_handed?
true
end
end
class LeftHandedScissor < AbstractScissor
def right_handed?
false
end
end
È quasi lo stesso dell'esempio 2, ma ho appena ribattezzato RightHandedScissor come Scissor. C'è una possibilità che qualcuno possa pensare che LeftHandedScissor sia una sottoclasse di Scissor basata unicamente sui nomi di classe, ma almeno il codice rende ovvio che non è così.
Qualche altra idea?