From 01a90dbb1ae1ce2065409a7e331bf71f475077ec Mon Sep 17 00:00:00 2001 From: Joao Esperancinha Date: Thu, 9 Nov 2023 19:57:06 +0100 Subject: [PATCH] Delegates example --- .../kotlin/org/jesperancinha/ktd/Delegates.kt | 53 +++++++++++++++++++ .../main/kotlin/org/jesperancinha/ktd/Main.kt | 3 ++ .../jesperancinha/ktd/delegates/Account.java | 49 +++++++++++++++++ .../org/jesperancinha/ktd/delegates/Card.java | 9 ++++ .../jesperancinha/ktd/delegates/Client.java | 14 +++++ .../ktd/delegates/DebitCard.java | 5 ++ .../jesperancinha/ktd/delegates/Person.java | 7 +++ 7 files changed, 140 insertions(+) create mode 100644 jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/Delegates.kt create mode 100644 jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/Account.java create mode 100644 jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/Card.java create mode 100644 jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/Client.java create mode 100644 jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/DebitCard.java create mode 100644 jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/Person.java diff --git a/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/Delegates.kt b/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/Delegates.kt new file mode 100644 index 000000000..38e48f151 --- /dev/null +++ b/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/Delegates.kt @@ -0,0 +1,53 @@ +package org.jesperancinha.ktd + +import java.time.LocalDateTime + +interface Person { + val name: String + val address: String +} + +interface Card { + val cardNumber: Long + val expiryDate: LocalDateTime +} + +data class Client( + override val name: String, + override val address: String +) : Person + +data class DebitCard( + override val cardNumber: Long, + override val expiryDate: LocalDateTime +) : Card + +class Account( + person: Person, + card: Card, + val number: String +) : Person by person, Card by card + +class Delegates { + companion object { + @JvmStatic + fun main(args: Array = emptyArray()) { + val account = Account( + Client( + name = "João", + address = "World" + ), + DebitCard( + cardNumber = 1111111111111111, + expiryDate = LocalDateTime.now() + ), + number = "AAABBB12312313-3243242-23432" + ) + println(account.number) + println(account.name) + println(account.address) + println(account.cardNumber) + println(account.expiryDate) + } + } +} \ No newline at end of file diff --git a/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/Main.kt b/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/Main.kt index cb214a1bd..72b3743ff 100644 --- a/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/Main.kt +++ b/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/Main.kt @@ -1,6 +1,7 @@ package org.jesperancinha.ktd import org.jesperancinha.ktd.crum5.Patisserie +import org.jesperancinha.ktd.delegates.Account class Main { companion object { @@ -14,6 +15,8 @@ class Main { WarehouseManager.main() TailRec.main() FloatVsDouble.main() + Delegates.main() + Account.main(emptyArray()) } } } \ No newline at end of file diff --git a/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/Account.java b/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/Account.java new file mode 100644 index 000000000..f1b1d0e6e --- /dev/null +++ b/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/Account.java @@ -0,0 +1,49 @@ +package org.jesperancinha.ktd.delegates; + +import java.time.LocalDateTime; + +public record Account( + Person person, + Card card, + String number + +) implements Card, Person { + @Override + public LocalDateTime expiryDate() { + return card.expiryDate(); + } + + @Override + public Long cardNumber() { + return card.cardNumber(); + } + + @Override + public String name() { + return person.name(); + } + + @Override + public String address() { + return person.address(); + } + + public static void main(String[] args) { + var account = new Account( + new Client( + "João", + "World" + ), + new DebitCard( + 1111111111111111L, + LocalDateTime.now() + ), + "AAABBB12312313-3243242-23432" + ); + System.out.println(account.number); + System.out.println(account.name()); + System.out.println(account.address()); + System.out.println(account.cardNumber()); + System.out.println(account.expiryDate()); + } +} diff --git a/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/Card.java b/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/Card.java new file mode 100644 index 000000000..31180accb --- /dev/null +++ b/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/Card.java @@ -0,0 +1,9 @@ +package org.jesperancinha.ktd.delegates; + +import java.time.LocalDateTime; + +public interface Card { + LocalDateTime expiryDate(); + + Long cardNumber(); +} diff --git a/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/Client.java b/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/Client.java new file mode 100644 index 000000000..326547354 --- /dev/null +++ b/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/Client.java @@ -0,0 +1,14 @@ +package org.jesperancinha.ktd.delegates; + + +public record Client(String name, String address) implements Person{ + @Override + public String name() { + return name; + } + + @Override + public String address() { + return address; + } +} diff --git a/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/DebitCard.java b/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/DebitCard.java new file mode 100644 index 000000000..67d6249af --- /dev/null +++ b/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/DebitCard.java @@ -0,0 +1,5 @@ +package org.jesperancinha.ktd.delegates; + +import java.time.LocalDateTime; + +public record DebitCard(Long cardNumber, LocalDateTime expiryDate) implements Card{} diff --git a/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/Person.java b/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/Person.java new file mode 100644 index 000000000..32f983325 --- /dev/null +++ b/jeorg-kotlin-crums/jeorg-kotlin-crums-4-variance/src/main/kotlin/org/jesperancinha/ktd/delegates/Person.java @@ -0,0 +1,7 @@ +package org.jesperancinha.ktd.delegates; + +public interface Person { + String name(); + + String address(); +}