Questo concetto permette ad una sottoclasse di essere usata ovunque una superclasse è usata.
/* Animal.cls */
CLASS Animal:
DEFINE VARIABLE cSpecies-name AS CHARACTER NO-UNDO.
METHOD VOID SetSpecies(iSpecies-name AS CHARACTER):
ASSIGN cSpecies-name = iSpecies-name.
END METHOD.
METHOD CHARACTER GetSpecies():
RETURN(cSpecies-name).
END METHOD.
METHOD CHARACTER GetInformation():
RETURN(cSpecies-name).
END METHOD.
CONSTRUCTOR Animal():
END CONSTRUCTOR.
CONSTRUCTOR Animal(iSpecies AS CHARACTER):
SetSpecies(iSpecies).
END CONSTRUCTOR.
END CLASS.
/* Bird.cls */
CLASS Bird
INHERITS Animal:
DEFINE VARIABLE iSpan AS INTEGER NO-UNDO.
METHOD VOID SetWingSpan(ipSpan AS INTEGER):
ASSIGN iSpan = ipSpan.
END METHOD.
METHOD INTEGER GetWingSpan():
RETURN(iSpan).
END METHOD.
CONSTRUCTOR Bird(iSpecies AS CHARACTER, ipSpan AS INTEGER):
SetSpecies(iSpecies).
SetWingSpan(iSpan).
END CONSTRUCTOR.
END CLASS.
/*Dog.cls */
CLASS Dog
INHERITS Animal:
DEFINE VARIABLE cBreed-name AS CHARACTER NO-UNDO.
METHOD VOID SetBreed(ip-breed-name AS CHARACTER):
ASSIGN cBreed-name = ip-breed-name.
END.
METHOD CHARACTER GetBreedName():
RETURN(cBreed-name).
END METHOD.
CONSTRUCTOR Dog(iSpecies AS CHARACTER, ip-breed AS CHARACTER):
SetSpecies(iSpecies).
SetBreed(ip-breed).
END CONSTRUCTOR.
END CLASS.
/* Inheritance.p */
USING inheritance.*.
DEFINE VARIABLE oBird AS Bird NO-UNDO.
DEFINE VARIABLE oDog AS Dog NO-UNDO.
oBird = NEW Bird("Cardellino", 5).
oDog = NEW Dog("Cani da pastore", "Pastore tedesco").
MESSAGE oBird:GetSpecies() SKIP
oBird:GetWingSpan()
VIEW-AS ALERT-BOX.
MESSAGE oDog:GetSpecies() SKIP
oDog:GetBreedName()
VIEW-AS ALERT-BOX.
principio di sostituzione di Liskov (Definizione tratta da WikipediA)
In altre parole, se una sottoclasse può sempre essere sostituita con la sua superclasse, allora
• il disegno è valido
• la sottoclasse può essere usata ovunque la sua superclasse può.
/* InheritanceAndSubstitution.p */
USING inheritance.*.
DEFINE VARIABLE oBird AS Bird NO-UNDO.
DEFINE VARIABLE oDog AS Dog NO-UNDO.
oBird = NEW Bird("Cardellino", 5).
oDog = NEW Dog("Cani da pastore", "Pastore tedesco").
/* Note passing subclass as a superclass parameter */
RUN show-species(oBird).
RUN show-species(oDog).
PROCEDURE show-species:
DEFINE INPUT PARAMETER oAnimal AS Animal NO-UNDO.
MESSAGE oAnimal:GetSpecies() SKIP
VIEW-AS ALERT-BOX.
END PROCEDURE.
0 commenti:
Posta un commento