You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
; Ein Funktionsaufruf
(+2342712)
; Eine Variable
(defvarpi3.1415)
; Ein Objekt (eine "komplexe" Variable, die mehrere zusammengehörige; Werte speichern kann)
(defvar person '(
'(:first-name"Donald")
'(:last-name"Duck")
'(:get-location (lambda () "Entenhausen"))
))
publicclassRectangle{publicintWidth{get;privateset;}publicintHeight{get;privateset;}publicRectangle(intwidth,intheight){this.Width=width;this.Height=height;}publicintGetArea(){returnthis.Width*this.Height;}}// Blöde Idee, weil sich das Verhalten der Flächenberechnung// ändert: Verdoppelt man zB die Höhe, vervierfacht sich die// Fläche des Quadrats, aber die vom Rechteck verdoppelt sich// lediglich!publicclassSquare:Rectangle{publicSquare(intsize):base(size,size){}}// Verletzung des Liskovschen Substitutionsprinzips (LSP)!// Alternativ: Composition over Inheritance (COI)publicinterfaceIWithArea{intGetArea();}publicinterfaceIWithCircumference{intGetCircumference();}publicclassRectangle:IWithArea,IWithCircumference{publicintWidth{get;privateset;}publicintHeight{get;privateset;}publicRectangle(intwidth,intheight){this.Width=width;this.Height=height;}publicintGetArea(){returnthis.Width*this.Height;}publicintGetCircumference(){return2*this.Width+2*this.Height;}}publicclassSquare:IWithArea,IWithCircumference{privateRectanglerect;publicSquare(intsize){this.rect=newRectangle(size,size);}publicintGetArea(){returnthis.rect.GetArea();}publicintGetCircumference(){returnthis.rect.GetCircumference();}}publicclassLine:IWithCircumference{// ...publicintGetCircumference(){// ...}}// ...publicvoidDoSomething(IWithAreashape){vararea=shape.GetArea();// ...}
publicclassBase{publicvoidNonVirtualFromBase(){}publicvirtualvoidVirtualFromBase(){}publicvoidNonVirtualFromDerived(){}}publicclassDerived:Base{publicoverridevoidVirtualFromBase(){}publicnewvoidNonVirtualFromDerived(){}}// ...publicvoidDoSomething(Baseobj){// "Normale" Methode aus der Basisklasse, wird immer in der// Basisklasse aufgerufen, egal was für `obj` übergeben wirdobj.NonVirtualFromBase();// Virtuelle Methode aus der Basisklasse, wird immer möglichst// weit unten in der Typhierarchie aufgerufen, in Abhängigkeit// davon, was als `obj` übergeben wird.obj.VirtualFromBase();// Nicht-virtuelle, aber geshadowte Methode aus der Basisklasse,// wird dort aufgerufen, was zum angegebenen Typ von `obj` passt,// in dem Fall (wegen der Signatur von DoSomething) also imnmer// die aus Base, es sei denn, `obj` würde nach Derived gecastet.obj.NonVirtualFromDerived();}