diff --git a/README.md b/README.md index c915dd7..ffc8ec9 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Lessons: - [encapsulation](./lessons/Encapsulation.md) - [inheritance](./lessons/Inheritance.md) - [properties](./lessons/Properties.md) - -- [polymorphism](./lessons/Polymorphism.md) - +- [polymorphism](./lessons/Polymorphism.md) Work in progress: diff --git a/java/Polymorphism.md b/java/Polymorphism.md new file mode 100644 index 0000000..3362350 --- /dev/null +++ b/java/Polymorphism.md @@ -0,0 +1,5 @@ +# Polymorphism + +Relevant files + +- [Program.java](./inheritance/Program.java) diff --git a/java/inheritance/Program.java b/java/inheritance/Program.java index e7afa0e..1794ef1 100644 --- a/java/inheritance/Program.java +++ b/java/inheritance/Program.java @@ -1,9 +1,14 @@ public class Program { public static void main(String[] args) { - Dog d = new Dog("buster"); - Cat c = new Cat("mittens"); + // because cat and dog are subclasses of animal, they can be stored in an array of animals + Animal[] animals = { + new Dog("buster"), + new Cat("mittens") + }; - d.make_sound(); - c.make_sound(); + for (Animal a : animals) { + // when calling the make_sound function, the implementation of the actual class gets called (in this case cat or dog) + a.make_sound(); + } } } diff --git a/java/inheritance/README.md b/java/inheritance/README.md index cb954f2..87ff74c 100644 --- a/java/inheritance/README.md +++ b/java/inheritance/README.md @@ -2,7 +2,6 @@ Relevant files: -- [Program.java](./Program.java) - [Animal.java](./Animal.java) - [Cat.java](./Cat.java) - [Dog.java](./Dog.java) diff --git a/lessons/Polymorphism.md b/lessons/Polymorphism.md index e69de29..af6939c 100644 --- a/lessons/Polymorphism.md +++ b/lessons/Polymorphism.md @@ -0,0 +1,19 @@ +# Polymorphism + +Polymorphism is the ability to treat subclasses like their base classes, for +example passing cat, which extends animal to a function that expects an animal +as parameter. or storing objects of different types that all extend a common +class in an array of that common type. + +You lose acess to the properties of the subclass, but you can still access the +base class like usual. When the subclass overrides behaviour of the base class, +the overridden functionality in the subclass is still called. + +You can regain access to properties of the subclass with casting, but you have +to make sure that the object is actually an instance of that class or you might +run into runtime errors. + +- [Java](../java/Polymorphism.md) +- [Rust](../rust/Inheritance.md) +- [C++](../cpp/Polymorphism.md) +- [JavaScript (using TypeScript)](../typescript/Polymorphism.md) diff --git a/typescript/Polymorphism.md b/typescript/Polymorphism.md new file mode 100644 index 0000000..1033f20 --- /dev/null +++ b/typescript/Polymorphism.md @@ -0,0 +1,5 @@ +# Polymorphism + +Relevant files + +- [index.ts](./inheritance/index.ts) diff --git a/typescript/inheritance/README.md b/typescript/inheritance/README.md index 3a8a430..30072de 100644 --- a/typescript/inheritance/README.md +++ b/typescript/inheritance/README.md @@ -2,7 +2,6 @@ Relevant files: -- [index.ts](./index.ts) - [animal.ts](./animal.ts) - [cat.ts](./cat.ts) - [dog.ts](./dog.ts) diff --git a/typescript/inheritance/index.ts b/typescript/inheritance/index.ts index c0e4797..c5fcb6f 100644 --- a/typescript/inheritance/index.ts +++ b/typescript/inheritance/index.ts @@ -1,8 +1,14 @@ import { Dog } from "./dog"; import { Cat } from "./cat"; +import { Animal } from "./animal"; -const d = new Dog('buster'); -const c = new Cat('mittens'); +// because cat and dog are subclasses of animal, they can be stored in an array of animals +const animals: Animal[] = [ + new Dog('buster'), + new Cat('mittens') +] -d.make_sound(); -c.make_sound(); +for (const a of animals) { + // when calling the make_sound function, the implementation of the actual class gets called (in this case cat or dog) + a.make_sound(); +}