diff --git a/content/oop.md b/content/oop.md new file mode 100644 index 0000000..5ee35b1 --- /dev/null +++ b/content/oop.md @@ -0,0 +1,40 @@ +--- +title: Object Oriented Programming +--- + +# Object Oriented Programming + +Object oriented programming is supported through inheritance and `methods`, which are virtual procedures. Methods work in the same was as procs, but when an method is called with an object, the method that is actually run is resolved at runtime and depends on the type of the object. + +Inheritance is created with the `of` keyword in the type declaration of an object. A method is overridden by creating a new method with parameter types of the subtype. + +``` nimrod +type Animal = ref object of TObject + name: string + age: int +method vocalize(this: Animal): string = "..." +method ageHumanYrs(this: Animal): int = this.age + +type Dog = ref object of Animal +method vocalize(this: Dog): string = "woof" +method ageHummanYrs(this: Dog): int = this.age * 7 + +type Cat = ref object of Animal +method vocalize(this: Cat): string = "meow" + + +var animals: seq[Animal] = @[] +animals.add(Dog(name: "Sparky", age: 10)) +animals.add(Cat(name: "Mitten", age: 10)) + +for a in animals: + echo a.vocalize() + echo a.age_human_yrs() +``` +``` console +$ nimrod c -r oop.nim +woof +10 +meow +10 +``` \ No newline at end of file diff --git a/content/toc.md b/content/toc.md index 8717525..202a2a3 100644 --- a/content/toc.md +++ b/content/toc.md @@ -9,7 +9,7 @@ * [Case Statements](/case/) * [For Loops & Iterators](/for_iterators/) * [Procs](/procs/) -* [Object Oriented Programming](/methods/) +* [Object Oriented Programming](/oop/) * [First Class Functions](/procvars/) * [Blocks](/block/) * [Primitive Types](/primitives/)