{"id":836,"date":"2023-08-31T13:40:31","date_gmt":"2023-08-31T11:40:31","guid":{"rendered":"https:\/\/oopm.org\/?page_id=836"},"modified":"2024-02-26T17:01:42","modified_gmt":"2024-02-26T16:01:42","slug":"6-subclasses","status":"publish","type":"page","link":"https:\/\/oopm.org\/?page_id=836","title":{"rendered":"8.x Alternative examples of subclasses"},"content":{"rendered":"<div class=\"pdfprnt-buttons pdfprnt-buttons-page pdfprnt-top-right\"><a href=\"https:\/\/oopm.org\/index.php?rest_route=wpv2pages836&print=pdf\" class=\"pdfprnt-button pdfprnt-button-pdf\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/oopm.org\/wp-content\/plugins\/pdf-print\/images\/pdf.png\" alt=\"image_pdf\" title=\"View PDF\" \/><\/a><a href=\"https:\/\/oopm.org\/index.php?rest_route=wpv2pages836&print=print\" class=\"pdfprnt-button pdfprnt-button-print\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/oopm.org\/wp-content\/plugins\/pdf-print\/images\/print.png\" alt=\"image_print\" title=\"Print Content\" \/><\/a><\/div>\n<p class=\"wp-block-paragraph\"><strong>Requirements<\/strong> for the example:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>It should be understandable by students and others<\/li>\n\n\n\n<li>It should be possible to complete it to a program that does something meaningful<\/li>\n\n\n\n<li>It should be as small as possible <\/li>\n\n\n\n<li>It must have non-virtual methods in all subclasses and the superclass<\/li>\n\n\n\n<li>It must have one or more virtual methods defined in the superclass and extends in subclasses<\/li>\n\n\n\n<li>It will be an advantage if it may have nested classes and virtual classes.<\/li>\n\n\n\n<li>There should be at least two levels in the subclass hierachy.<\/li>\n\n\n\n<li>However, we also need a bigger example, but probably later.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Composition<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Classification and composition are means to organize complexity in terms of hierarchies. A classification is represented by a class\/subclass hierarchy, as we have seen already. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Composition is related to either part-whole hierarchies on phenomena, and decomposition of methods (procedures and functions) into local methods. We do not consider the last kind of composition further here since it should be well-known from programming languages in general. However, in the following we will cover part-whole hierarchies.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">+++?important to be aware that they are two different conceptual means \u2013 the one cannot replace the other and vice versa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The language mechanism to describe part-whole composition is called composite objects. Embedded objects are fixed parts of the composite object, and it has a name that is a constant reference to the object. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In [55] we showed that the combination of embedded objects and nesting as in Beta may be used to inherit\/include code from other classes in a form that avoids most of the problems with multiple inheritance. The proposal is thus also an alternative to mixins and traits.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Consider a class Address:<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code><strong>class<\/strong> Address:\n   street: <strong>ref<\/strong> String\n   streetNo: <strong>var<\/strong> integer\n&nbsp;&nbsp;&nbsp;town: <strong>ref<\/strong> String\n&nbsp;&nbsp;&nbsp;country: <strong>ref<\/strong> String\n&nbsp;&nbsp;&nbsp;print:&lt;\n&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;inner(print)\n&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;print{street,streetNo,town,Country}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">An Address may be embedded in a Person object:<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background\"><code>  <strong>class<\/strong> Person:\n&nbsp;&nbsp; &nbsp;&nbsp;name: <strong>ref<\/strong> String\n&nbsp;&nbsp; &nbsp;&nbsp;addr: <strong>obj<\/strong> Address\n     ...\n\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The keyword <strong>ref<\/strong> declares an ordinary reference to an object of the class \u2013 in the above cases String objects. The keyword <strong>obj<\/strong> specifies an embedded object of the class \u2013 in this case addr is the name of an Address object being embedded in the holding Person object.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">+++ eventuelt<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Virtual classes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In some cases the concept represented by a class is a concept where the phenomena consist of a sets\/structures of phenomena (and their concepts) that are defined in the context of the main concept. We have seen that this is covered by nesting, i.e. defining objects\/classes in the context of an object\/class. We say that description of these object\/classes are nested within the description of the outer object\/class.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We also have cases where the nested classes have to extended in subclasses of the enclosing class. This calls for the notion of virtual classes; they are similar to virtual methods. The properties of objects of a virtual class, even if generated as part of activities of the enclosing class, will be the properties of the extended virtual class for the given subclass.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As an example consider the concept of representing expressions as structures of objects representing the various parts of the expression. We call the class representing this concept MetaExpression. For simplicity we just include a subset of what would be in a real meta expression. As the classes have to be extended depending on what we would like to do with expressions, e.g. print or evaluate, we define them as virtual classes:<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code><strong>class<\/strong> MetaExpression \n   <strong>class<\/strong> Expr:&lt; Object\n\n   <strong>class<\/strong> Constant(val: <strong>var<\/strong> Integer):&lt; Expr\n   \n   <strong>class<\/strong> BinaryExpr(left, right: <strong>ref<\/strong> Expr):&lt; Expr\n      \n   <strong>class<\/strong> Add:&lt; BinaryExpr\n   \n   <strong>class<\/strong> Mult:&lt; BinaryExpr\n<\/code><\/pre>\n\n\n\n<p class=\"has-pale-cyan-blue-background-color has-background has-small-font-size wp-block-paragraph\">Her er en dobbelt virtuel super. Super for Add (og Mult) er BinaryExpr som er virtuel  og super for BinaryExpr er Expr som er virtuel<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There are two ways of generating an expression, either by a function (makeExpression) or as part of an object of class MetaExpression:<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code>exampleExpression: <strong>ref<\/strong> MetaExpression\n\nmakeExpression(meta: <strong>ref<\/strong> MetaExpression) -&gt; <strong>ref<\/strong> meta.Expr:\n   const1: <strong>ref<\/strong> meta.Expr := meta.Constant(-3)\n   const2: <strong>ref<\/strong> meta.Expr := meta.Constant(2)\n   op1: <strong>ref<\/strong> meta.Expr := meta.Mult(const1, const2)\n   const3: <strong>ref<\/strong> meta.Expr := meta.Constant(5)\n   op2: <strong>ref<\/strong> meta.Expr := meta.Add(op1, const3)\n   return op2\n\n...\nexampleExpression: <strong>ref<\/strong> MetaExpression\nexp: <strong>ref<\/strong> exampleExpression.Expr\nexp := makeExpression(exampleExpression)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code>exampleExpression: <strong>obj<\/strong> MetaExpression\n   const1: <strong>ref<\/strong> Expr := Constant(1)\n   const2: <strong>ref<\/strong> Expr := Constant(2)\n   op1: <strong>ref<\/strong> Expr := Mult(const1, const2)\n   const3: <strong>ref<\/strong> Expr := Constant(3)\n   op2: <strong>ref<\/strong> Expr := Add(op1, const3)  \n   expression: <strong>ref<\/strong> Expr := op2\n\n...\nexampleExpression.expression<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The above expression may in qBeta be expressed somewhat simpler:<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code>expression := Add(Mult(Constant(1),Constant(2)),Constant(3))<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code>meta: <strong>obj<\/strong> MetaExpression\n...\nexpr1, expr2: <strong>ref<\/strong> meta.Expr\n\nexpr1 := \n   meta.Add(meta.Mult(\n   meta.Constant(1),meta.Constant(2)),meta.Constant(3))\n   \nexpr2 := \n   meta.Add(meta.Mult(\n   meta.Constant(4),meta.Constant(5)),meta.Constant(6))\n...\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If we want to print expression we would need a formating method for each part of the expression. This is done by extending the virtual classes, adding a method format. Note that for the general class Expr this format is defined as a virtual method that is extended in subclasses of Expr:<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code>\n<strong>class<\/strong> ExprFormat: MetaExpression\n\n   <strong>class<\/strong> Expr::\n      format -&gt; String:&lt;\n         inner(format)\n\n   <strong>class<\/strong> Constant:: \n      format:: \n         return val    --??\n \n   <strong>class<\/strong> BinaryExpr:: \n      format:: \n         return \u201c(\u201d + left.format + operatorSymbol \n                    + right.format + \u201c)\u201d;\n      \n      operatorSymbol -&gt; String:&lt;\n         inner(operatorSymbol)\n   \n   <strong>class<\/strong> Add:: \n      operatorSymbol::\n         return \u2018+\u2019 \n\n   <strong>class<\/strong> Mult:: \n      operatorSymbol::\n         return \u2018*\u2019\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background\"><code>meta: <strong>ref<\/strong> MetaExpression\n\nmeta := MetaExpression\nexpr1, expr2: <strong>ref<\/strong> meta.Expr\n\nexpr1 := \n   meta.Add(meta.Mult(\n   meta.Constant(1),meta.Constant(2)),meta.Constant(3))\n   \nexpr2 := \n   meta.Add(meta.Mult(\n   meta.Constant(4),meta.Constant(5)),meta.Constant(6))\n\nexpr1.format   not possible\nexpr2.format   not possible\n\nmeta := ExprFormat\nexpr1 := \n   meta.Add(meta.Mult(\n   meta.Constant(1),meta.Constant(2)),meta.Constant(3))\nexpr2 := \n   meta.Add(meta.Mult(\n   meta.Constant(4),meta.Constant(5)),meta.Constant(6))\n...\nexpr1.format   \nexpr2.format   \n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background\"><code>\n<strong>class<\/strong> Testing:\n   <strong>class<\/strong> Meta:&lt; MetaExpression\n   metaObj: <strong>ref<\/strong> Meta\n   expr1, expr2: <strong>ref<\/strong> Meta.Expr\n\n   expr1 := \n      metaObj.Add(MetaExpression.Mult(\n      MetaExpression.Constant(1), MetaExpression.Constant(2)), \n      MetaExpression.Constant(3))\n   \n   expr2 := \n      MetaExpression.Add(MetaExpression.Mult(\n      MetaExpression.Constant(4), MetaExpression.Constant(5)), \n      MetaExpression.Constant(6))\n\nformatTesting: <strong>obj<\/strong> Testing\n   Meta:: ExprFormat\n   expr1.format   \n   expr2.format  \n\nevalTesting: <strong>obj<\/strong> Testing\n   Meta:: ExprEval\n   expr1.eval   \n   expr2.eval<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For evaluating  expressions we need to extend class expr with an eval method, and then extend this in the subclasses of Expr:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background\"><code><strong>class<\/strong> ExprEval: MetaExpression\n\n   <strong>class<\/strong> Expr::\n      eval -&gt; Integer:&lt;\n         inner(eval)\n\n   <strong>class<\/strong> Constant:: \n      eval:: \n         return val \n      \n   <strong>class<\/strong> Add:: \n      eval::\n         return left.eval + right.eval \n   \n   <strong>class<\/strong> Mult:: \n     eval::\n         return left.eval * right.eval \n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Notes: <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If just an extension symbol (::) is used, then the extension is simply an extension of the virtual class, just as if the extension was a subclass of the virtual class. This also imply that the properties of the virtual class are visible in the extension. Add and Mult being extensions of BinaryExpr therefore implies that left and right are visible and can be used in eval.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">+++ n\u00e6vne :: &lt;class&gt; ??<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">shapes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here are some of the basic elements of 2D geometry: points, lines, line segments and angles:<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code><strong>class<\/strong> Point(x,y: <strong>var<\/strong> Integer):\n   distance(another: <strong>var<\/strong> Point) -&gt; Real \n      xDiff: <strong>var<\/strong> Integer = this.x - another.x\n      yDiff: <strong>var<\/strong> Integer = this.y - another.y\n      return sqrt(xDiff * xDiff + yDiff * yDiff)\n   \n<strong>class<\/strong> Line(p1,p2: <strong>var<\/strong> Point):\n   ...   \n\n<strong>class<\/strong> LineSegment(p1,p2: <strong>var<\/strong> Point):\n   ...  \n\n<strong>class<\/strong> Angle (vertex, p1, p2: <strong>var<\/strong> Point):\n   side1, side2: <strong>var<\/strong> LineSegment\n   side1 := LineSegment(vertex, p1)   \n   side2 := LineSegment(vertex, p2)<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code><strong>class<\/strong> Triangle: Shape2D\n   a,b,c: <strong>var<\/strong> Point\n   <strong>class<\/strong> Measures::\n      area::\n         return abs(\n            (a.x * (b.2 \u2013 c.y) + b.x * (c.y \u2013 a.y) + \n             c.x * (a.y \u2013 b.y)) \/ 2.0\n            )\n\n<strong>class<\/strong> Rectangle: Shape2D\n   topLeft: <strong>var<\/strong> Point\n   height, width: <strong>var<\/strong> Real\n   <strong>class<\/strong> Measures::\n      area::\n         return height * width\n      perimeter::\n         return 2 * height + 2 * width\n\n\n<strong>class<\/strong> Circle: Shape2D\n   radius: <strong>var<\/strong> Real\n   <strong>class<\/strong> Measures::\n      area::\n         return PI * radius * radius\n      perimeter::\n         return 2.0 * PI * radius\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>class<\/strong> Movable:\n   moveTo(to: <strong>var<\/strong> Point):&lt;\n\n\n<strong>class<\/strong> Shape:\n   center: <strong>var<\/strong> Point\n   moving: <strong>obj<\/strong> Movable\n      moveTo::\n         center := to\n\n...\norigin := Point(0,0)\naShape.moving.moveTo(origin)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code><strong>class<\/strong> Triangle: Shape2D\n   a,b,c: <strong>var<\/strong> Point\n   area::\n      return abs(\n         (a.x * (b.2 \u2013 c.y) + b.x * (c.y \u2013 a.y) + \n         c.x * (a.y \u2013 b.y)) \/ 2.0\n         )\n\n<strong>class<\/strong> Rectangle: Shape2D\n   topLeft: <strong>var<\/strong> Point\n   height, width: <strong>var<\/strong> Real\n   perimeter::\n      return 2 * height + 2 * width\n   area::\n      return height * width\n\n<strong>class<\/strong> Circle: Shape2D\n   radius: <strong>var<\/strong> Real\n   perimeter::\n      return 2.0 * PI * radius\n   area:: \n      return PI * radius * radius\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For shapes in 3D the interesting properties are surface and volume, and again, they have in class Shape3D to be defined as virtual methods as these properties depend on the types of shape:<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code><strong>class<\/strong> Shape3D:\n   surface -&gt; Real:&lt;\n      inner\n   volume -&gt; Real:&lt;\n      inner\n\n<strong>class<\/strong> Cylinder: 3dShape\n   base: <strong>var<\/strong> Circle\n   height: <strong>var<\/strong> Real\n   surface::\n     return 2 * base.area + height * base.perimeter\n   volume::\n      return base.area * height<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Bank System<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-foreground-color\">An attempt to detail subclasses of Account<\/mark><\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code><strong>class<\/strong> Account:\n   balance: <strong>var<\/strong> Real\n   interestRate: <strong>var<\/strong> Real\n   ...\n   deposit(amount: <strong>var<\/strong> Real):&lt;     -- iflg Eiffel.Inheritance er denne \n      balance := balance + amount  -- virtuel og redefineres i\n      inner                        -- saving account; lagt ind her\n   \n<strong>class<\/strong> SavingsAccount: Account\n   bindingPeriod: <strong>var<\/strong> Date -- eller Period?\n   minimumBalance: <strong>var<\/strong> Real -- to avoid monthly fees \n   deposit:\n      -- in addition add interest to balance\n      balance := balance + interest     -- interest to be calculated\n<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-foreground-color\">+++olm: man adderer vel ikke interest for hver deposit?<\/mark>\n+++bmp: s\u00e5dan forstod jeg eksemplet i Eiffel, men reagerede ogs\u00e5\n   withdraw: \n      -- needs to check that it is after bindingPeriod\n      -- but here we do not have virtuals\/extension\n   newBindingPeriod(p: <strong>var<\/strong> Data, newInterest: <strong>var<\/strong> Real):\n      bindingPeriod := p\n      interest := newInterest\n<strong>class<\/strong> CreditAccount : Account\n   maxCredit: <strong>var<\/strong> Real\n   overdrawInterest: <strong>var<\/strong> Real -- interest for going over maxCredit\n   changeCredit(newMax: var Real\n               , newInterest: var Real\n               , newOverdrawInterest: var Real):\n      ...\n   withdraw: -- must also be specialized\n<strong>class<\/strong> RetirementAccount: SavingsAccount\n   retirementAge: <strong>var<\/strong> Integer  -- min age to start payments\n   lastRetirementAge: <strong>var<\/strong> Integer -- latest age to start payments\n   -- bindingPeriod actually defines retirementAge, \n   -- so rA may not be needed!?\n   noOfMonthlyPayOutRates: <strong>var<\/strong> integer\n   -- en pensionsopsparing udbetales typisk i 10 \u00e5rlige rater\n    <\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code><strong>Account<\/strong>:\n   SavingsAccount\n   CheckingAccount, \n   CreditAccount \n      (limit, non-positive, extraInterestRate, \n       paymentDate\/period, \n   PaymentAccount \n   BusinessAccount<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Hvis der i Account findes en virtuel metode, som banken gerne vil have udf\u00f8rt for alle deres accounts, da ville vi have et eksempel som svarer til Record, Person, &#8230;  Det er dog for enkelt bare at summere balance for alle accounts, til det beh\u00f8ver man ikke nogen virtuel. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>Nordea<\/em><\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GrundKonto<\/li>\n\n\n\n<li>GrundKonot med kredit<\/li>\n\n\n\n<li>L\u00f8nkonto+ til unge under 18 \u00e5r<\/li>\n\n\n\n<li>Kassekredit til unge<\/li>\n\n\n\n<li>Ungdomskonto 13-17 \u00e5r<\/li>\n\n\n\n<li>Juniorkonto 0-12 \u00e5r<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">denne her bank har forskellige typer af checking accounts and saving accounts<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">https:\/\/www.calbanktrust.com\/personal<a href=\"https:\/\/www.calbanktrust.com\/personal\/\">\/<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>Eiffel<\/em><\/strong> i denne her<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.eiffel.org\/doc\/eiffel\/ET-_Inheritance\">https:\/\/www.eiffel.org\/doc\/eiffel\/ET-_Inheritance<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bruger Account og SavingsAccount og senere BusinessAccount<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">University System<\/h2>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code>\n<strong>class<\/strong> Affiliate:\n   -- the superclass for employees and students, \n      but is Affiliate a good name?\n   <mark style=\"background-color:rgba(0, 0, 0, 0);color:#f70f0f\" class=\"has-inline-color\">++ BMP: nok desv\u00e6rre ikke, men vi kan jo bare bruge Person<\/mark>\n<strong>class<\/strong> Employee: Affiliate \n   titel, salary, unit, computeSalary\/updateSalary,\n   markVacation, \n<strong>class<\/strong> Faculty: Employee -- VIP\n   research area, publications, addPublication, \n   courses, researchGroup\n<strong>class<\/strong> TAP: Employee\n   tasks, ... \n<strong>class<\/strong> Student: Affiliate\n   name: <strong>val<\/strong> String   m\u00e5ske i Affiliate\n   studId: <strong>val<\/strong> integer\n   coursesTaken: <strong>obj<\/strong> List(Course)\n   coursesFailed: <strong>obj<\/strong> List(Course)\n   coursesActive: <strong>obj<\/strong> List(Course)\n   passed(C: <strong>ref<\/strong> Course):\n      ...\n   ...\n\n   enrollments:  <strong>obj<\/strong> Set(Enrollment)\n   <mark style=\"background-color:rgba(0, 0, 0, 0);color:#e91212\" class=\"has-inline-color\">+++ BMP: dette er ikke noget jeg har fundet p\u00e5, taget fra nettet\n            det er det ord som bruges, og grade er typisk der<\/mark>\n\n   signUpForCourse(c: <strong>ref<\/strong> Course, s: <strong>var<\/strong> Semester):    \n      c.enroll(this(Student), s)\n\n<strong>class<\/strong> Enrollment(s: <strong>ref<\/strong> Student, c: <strong>ref<\/strong> Course, s: <strong>var<\/strong> Semester):\n   grade: <strong>var<\/strong> Character   -- A-F +++ kan osg\u00e5 v\u00e6re A+, mm.\n\n<strong>class<\/strong> Course:\n   ECTS: <strong>val<\/strong> Integer\n   teacher: <strong>ref<\/strong> Faculty   -- m\u00e5ske Set(Faculty)\n   required: <strong>obj<\/strong> Set(Course)\n   students: <strong>obj<\/strong> Set(Enrollment)\n\n   enroll(stud: <strong>ref<\/strong> Student, sem: <strong>var<\/strong> Semester):\n     -- Check if required courses have been passed\n   er : <strong>ref<\/strong> Enrollment\n   ok: <strong>var<\/strong> boolean\n   ok := true\n   for each required course rc in required\n      for each enrollment er in stud.enrollments\n         if not(er.has(rc)) then ok:= false\n         if (er.grade = 'F') then ok:= false\n   if ok then\n      students.insert(Enrollment(stud, this(Course), sem)\n\n+++ enroll er desv\u00e6rre ikke nogen virtuel metode\n\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#e11d1d\" class=\"has-inline-color\">+++BMP: med disse subklasser har vi 3 levels, men ingen virtuel!\n<\/mark>\n<strong>class<\/strong> Bachelor: Student\n   requiredECTS <strong>var<\/strong> Integer\n   project: <strong>ref<\/strong> BachelorProject\n   dateOfDegree: <strong>var<\/strong> Date\n   ...\n<strong>class<\/strong> Master: Student\n   requiredECTS <strong>var<\/strong> Integer\n   project: <strong>ref<\/strong> MasterProject\n   bachelorDegree: <strong>ref<\/strong> Bachelor\n   ...\n<strong>class<\/strong> PhD: Student\n   project: <strong>ref<\/strong> PhDProject\n   masterDegree: <strong>ref<\/strong> Master\n   ...<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code><em>Fra Xiaoping Jia<\/em>\nStudent \n   Nondegree\n   Undergraduate\n   Graduate\n      Master\n      PhD<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Student<\/strong>, course, bachelor, candidate, PhD, Examines (characters, &#8216;A&#8217;, .., &#8216;F&#8217;)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">E-bookstore <\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Xiaoping Jia: OO software development using Java<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code>EBookstore, Estore, DigitalStore\nCustomer\nItem\n   eBook\n   MusicCD\n   Software\nShoppingCart\nOrder\nOrderItem\n   I: Item\n   quantity: <strong>var<\/strong> integer\nPayment\nAddress\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>BlueJ: <\/strong>They start with an example of a social media for displaying Posts. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The hierarchy is as follows:<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code><code>   Post\n      CommentedPost\n         MessagePost\n         PhotoPost\n      EventPost<\/code><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">They also shortly mention the Mammal, Animal, etc example. <br>And shortly a game example (from chap 8) with Room, TransporterRoom.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In chap. 16 BlueJ has an example of a taxi company<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code>TaxiCompany:\nVehicle \n   Taxi\n   Shuttle<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">We may add limosine as a subclass. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It would be nice if there are subclasses of one or more of Taxi, Shuttle and Limosine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-foreground-color\">BlueJ also has a simulation and\/or spottings of populations of rabbits and foxes.<\/mark><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vehicle licenseFee<\/h2>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code>a la dimension\/units\n\n<strong>class<\/strong> Insurance:\n   <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-foreground-color\">customer: <strong>ref<\/strong> Person<\/mark>\n   premium: <strong>var<\/strong> Real\n   <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-foreground-color\">kmLimit: <strong>var<\/strong> Real<\/mark>\n   noOfDays: <strong>var<\/strong> Integer  -- number of days the vehicle\n                          -- has been insured this year\n   ...\n\n<strong>class<\/strong> Vehicles:\n   noOfVehicles: <strong>var<\/strong> Integer\n   <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-foreground-color\">feeRate<\/mark>: <strong>var<\/strong> Real\n   ...\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#14640c\" class=\"has-inline-color\">   -- alternativt kan man lage en virtuel klasse:\n   <strong>class<\/strong> VehicleInsurance:&lt; Insurance<\/mark>  <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-foreground-color\">-- demonstrerer qualification\n                                       -- af virtuelle<\/mark>\n      <mark style=\"background-color:rgba(0, 0, 0, 0);color:#1a6e15\" class=\"has-inline-color\">kmLimit: <strong>var<\/strong> Real\n      noOfDays: <strong>var<\/strong> Integer  -- number of days the vehicle\n                             -- has been insured this year<\/mark>\n\n   <strong>class<\/strong> Vehicle(licenseNumber: <strong>ref<\/strong> String)\n      weight: <strong>var<\/strong> Integer\n      ins: <strong>ref<\/strong> Insurance\n      licenseFee:&lt;\n         fee: <strong>var<\/strong> Real\n         inner(licenseFee)  -- calculate fee for different Vehicles\n         -- add fee to insurance premium\n         ins.premium := ins.premium + fee\n\n      noOfVehicles := noOfVehicles + 1\n   \n   <strong>class<\/strong> Car: Vehicle\n      ...\n   \nmotorBikes: <strong>obj<\/strong> Vehicles\n   ...\n <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-foreground-color\">  <strong>class<\/strong> BikeInsurance: Insurance\n      ...<\/mark> <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-foreground-color\">--- kan det bruges til noget fornuftig?<\/mark>\n\n   <mark style=\"background-color:rgba(0, 0, 0, 0);color:#14640c\" class=\"has-inline-color\"><strong>class<\/strong> VehicleInsurance::<\/mark>\n      ...\n\n   <strong>class<\/strong> MotorBike: Vehicle\n      licenseFee::\n         fee := <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-foreground-color\">feeRate<\/mark>*ins.noOfDays\n      ...\n      \nfuelCars: <strong>obj<\/strong> Vehicles\n   weightLimit: <strong>var<\/strong> Integer\n   lightCarFee, heavyCarFee: <strong>var<\/strong> Real\n   ...\n   <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-foreground-color\"><strong>class<\/strong> FuelCarInsurance: Insurance\n      ...<\/mark> <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-foreground-color\">--- kan det bruges til noget fornuftig?<\/mark>\n\n   <mark style=\"background-color:rgba(0, 0, 0, 0);color:#14640c\" class=\"has-inline-color\"><strong>class<\/strong> VehicleInsurance::<\/mark>\n      ...\n\n   <strong>class<\/strong> FuelCar: Car\n      licenseFee::\n         if (weight &gt; weightLimit) :then\n            fee := heavyCarFee*ins.noOfDays\n         :else\n            fee := lightCarFee*ins.noOfDays\n     \nelectricCars: <strong>obj<\/strong> Vehicles\n<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-foreground-color\">   <strong>class<\/strong> ElectricCarInsurance: Insurance\n      ... --- kan det bruges til noget fornuftig?<\/mark>\n\n   <mark style=\"background-color:rgba(0, 0, 0, 0);color:#14640c\" class=\"has-inline-color\"><strong>class<\/strong> VehicleInsurance::<\/mark>\n      ...\n\n   <strong>class<\/strong> ElectricCar: Car\n     vlicenseFee::\n         fee := <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-foreground-color\">feeRate<\/mark>*ins.noOfDays\n\ntaxis: <strong>obj<\/strong> Vehicles\n   <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-foreground-color\"><strong>class<\/strong> TaxiInsurance: Insurance\n      ... --- kan det bruges til noget fornuftig?<\/mark>\n\n   <mark style=\"background-color:rgba(0, 0, 0, 0);color:#14640c\" class=\"has-inline-color\"><strong>class<\/strong> VehicleInsurance::<\/mark>\n      ...\n   <strong>class<\/strong> Taxi: Car\n      licenseFee::\n         fee := <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-foreground-color\">feeRate<\/mark>*ins.noOfDays\n\nEvery year the rates are changed, the figures are for2023:\n\ntaxies.feeRate := 1,42\nmotorBikes.feeRate := 6,10\nfuelCars.weightLimit := 7500\nfuelCars.lightCarFee := 8,38\nfuelCars.heavyCarFee := 9,84\nelectricCars.feeRate := 8,38\n...\n\n<strong>class<\/strong> VehicleRegister: \n   ...\n   registrations: <strong>obj<\/strong> Set(Registration)\n   <strong>class<\/strong> Registration: \n      theVehicle: <strong>ref<\/strong> Vehicles.Vehicle\n      theOwner: <strong>ref<\/strong> Customer\n   ...\n   registerTaxi(owner: <strong>ref<\/strong> Customer, licenseNo: <strong>ref<\/strong> String):\n      reg: <strong>ref<\/strong> Registration\n      reg := Registration\n      reg.theVehicle := taxies.Taxi(licenseNo)  <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-foreground-color\">-- remote classes<\/mark>\n      reg.theOwner(owner)\n      registrations.add(reg)\n\nnumber of taxies: taxies.noOfVehicles\nnumber of motor bikes: motorbikes.noOfVehi<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of a Vehicle Registration System, we may use a Vehicle Rental System, which perhaps have more methods? Da slipper vi at forholde os til hvordan licenseFee beregnes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Record<\/strong>, Person, Employee, Student, Book<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Organization:<\/strong> Company, <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Figure<\/strong>, Polygon, Circle, Square, Rectangle, Rombe, &#8230; <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Library<\/strong>, Book, Fiction, Non-fiction, ScienceFiction, Novels, Poem, ShortStory, Person, Loan, <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Publications<\/strong>, EndNote, Journal, Conference, TechnicalReport, Book, <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Kirkerud<\/strong>: Place, MountainTop, House, Town, DetachedHouse, OfficeBuilding<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kirkerud indf\u00f8rer <em><strong>syntax diagrams <\/strong><\/em>(side 26) fra starten<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Budd<\/strong> (187-206): Super:CardPile, sub:SuitPile, DeckPile, DiscardPile, TableauPile, &#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is a quite complex and big example that will tale time to understand and probably too big for this chapter. But might be a candidate for a large example!?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rumbaugh<\/strong>: super:Equipment, sub:Pump, HeatExchanger, Tank, Centrifugal Pump, &#8230;, SphericalTank, &#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Animal<\/strong>, Mammal, Cat, Dog, &#8230; &#8212; men hvad skal det bruges til?<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code>let a = 7, and b = 8 in (a &lt; b) &lt;= ( a = b) and (a &gt; b)<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code>&#91;a,b] (a &lt; b) &lt;= ( a = b) and (a &gt; b) &#91;13,45]\nexp\n  relExp\n   <\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Settlement<\/strong> may include&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Hamlet_(place)\">hamlets<\/a>,&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Village\">villages<\/a>,&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Town\">towns<\/a>&nbsp;and&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/City\">cities<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code><strong>class<\/strong> Settlement: Graph\n   house:&lt; ...\n   road: ...\n   noOfInhabitants: <strong>var<\/strong> integer\n   name: <strong>var<\/strong> String\n<strong>class<\/strong> Village: Settlement\n   house:: ... ?<\/code><\/pre>\n\n\n\n<p class=\"has-pale-cyan-blue-background-color has-background has-small-font-size wp-block-paragraph\">Adresser, stoppesteder, bus\/trick\/ruter, ruteplanl\u00e6gning, &#8230;<br>Biler, addresser, &#8230;, <br>Offentlig transport<br>G\u00e5, cykle, &#8230;, <br>Travel leg, &#8230;<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code><strong>class<\/strong> Country:\n   <strong>class<\/strong> Route:\n      stops: <strong>obj<\/strong> list(Links)\n<strong>   class<\/strong> BusStop: -- Node\n      loc: <strong>ref<\/strong> Location\/Address\n   <strong>class<\/strong> Link:  -- Link \/ Leg\n       start,end: <strong>ref<\/strong> BusStop\n       distance: <strong>var<\/strong> Real<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code><strong>class<\/strong> Graph:\n   <strong>class<\/strong> Node:&lt;\n      firstEdge: <strong>ref<\/strong> Edge\n      insertEdgeTo(to: <strong>ref<\/strong> Node)-&gt; <strong>ref<\/strong> Edge:\n         ...\n      display:&lt;\n\n   <strong>class<\/strong> Edge:&lt;\n      from, to: <strong>ref<\/strong> Node\n      nextEdge: <strong>ref<\/strong> Edge;\n      deleteMe:&lt;\n      display:&lt;\n         inner(display)\n\n<strong>class<\/strong> RoadAndCityGraph: Graph \n   <strong>class<\/strong> Node::&lt; \n      cityName: <strong>ref<\/strong> String\n      ...\n      display::\n         ... name of the city\n\n      firstEdge.roadLength  \n\n   <strong>class<\/strong> Edge::&lt;\n      roadLength: <strong>var<\/strong> Integer\n      ...\n      display::\n         ... length of the road\n\n      from.cityName\n<\/code><\/pre>\n<div style=\"display:flex; gap:10px;justify-content:center\" class=\"wps-pgfw-pdf-generate-icon__wrapper-frontend\">\n\t\t<a  href=\"https:\/\/oopm.org?action=genpdf&amp;id=836\" class=\"pgfw-single-pdf-download-button\" ><img src=\"https:\/\/oopm.org\/wp-content\/plugins\/pdf-generator-for-wp\/admin\/src\/images\/PDF_Tray.svg\" title=\"Generate PDF\" style=\"width:auto; height:45px;\"><\/a>\n\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Requirements for the example: Composition Classification and composition are means to organize complexity in terms of hierarchies. A classification is represented by a class\/subclass hierarchy, as we have seen already. Composition is related to either part-whole hierarchies on phenomena, and decomposition of methods (procedures and functions) into local methods. We do not consider the last [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":2825,"menu_order":8,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-836","page","type-page","status-publish","hentry"],"mb":[],"mfb_rest_fields":["title","gutenberg_elementor_mode"],"_links":{"self":[{"href":"https:\/\/oopm.org\/index.php?rest_route=\/wp\/v2\/pages\/836","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oopm.org\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/oopm.org\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/oopm.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/oopm.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=836"}],"version-history":[{"count":205,"href":"https:\/\/oopm.org\/index.php?rest_route=\/wp\/v2\/pages\/836\/revisions"}],"predecessor-version":[{"id":3974,"href":"https:\/\/oopm.org\/index.php?rest_route=\/wp\/v2\/pages\/836\/revisions\/3974"}],"up":[{"embeddable":true,"href":"https:\/\/oopm.org\/index.php?rest_route=\/wp\/v2\/pages\/2825"}],"wp:attachment":[{"href":"https:\/\/oopm.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=836"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}