From 11d42778e350371c2af9faee5675ed7c72463a76 Mon Sep 17 00:00:00 2001 From: asadlodhi Date: Wed, 27 Aug 2025 18:26:35 +0500 Subject: [PATCH 1/2] OOP Concepts Abstraction inplemented in Abstract LibraryItem class Inheritance & Polymorphism implemented in Book, DVD, Magazine classes Encapsulation implemented in Member class Other changes include: renamed App.kt -> Main.kt added sample data in fun main() to test Book and Member classes --- app/src/main/kotlin/org/example/App.kt | 15 ----- app/src/main/kotlin/org/example/Book.kt | 14 ++++ app/src/main/kotlin/org/example/DVD.kt | 14 ++++ .../main/kotlin/org/example/LibraryItem.kt | 16 +++++ app/src/main/kotlin/org/example/Magazine.kt | 13 ++++ app/src/main/kotlin/org/example/Main.kt | 24 +++++++ app/src/main/kotlin/org/example/Member.kt | 64 +++++++++++++++++++ 7 files changed, 145 insertions(+), 15 deletions(-) delete mode 100644 app/src/main/kotlin/org/example/App.kt create mode 100644 app/src/main/kotlin/org/example/Book.kt create mode 100644 app/src/main/kotlin/org/example/DVD.kt create mode 100644 app/src/main/kotlin/org/example/LibraryItem.kt create mode 100644 app/src/main/kotlin/org/example/Magazine.kt create mode 100644 app/src/main/kotlin/org/example/Main.kt create mode 100644 app/src/main/kotlin/org/example/Member.kt diff --git a/app/src/main/kotlin/org/example/App.kt b/app/src/main/kotlin/org/example/App.kt deleted file mode 100644 index a1d413b..0000000 --- a/app/src/main/kotlin/org/example/App.kt +++ /dev/null @@ -1,15 +0,0 @@ -/* - * This source file was generated by the Gradle 'init' task - */ -package org.example - -class App { - val greeting: String - get() { - return "Hello World!" - } -} - -fun main() { - println(App().greeting) -} diff --git a/app/src/main/kotlin/org/example/Book.kt b/app/src/main/kotlin/org/example/Book.kt new file mode 100644 index 0000000..ad9dda4 --- /dev/null +++ b/app/src/main/kotlin/org/example/Book.kt @@ -0,0 +1,14 @@ +package org.example + +class Book( + id: String, + title: String, + val author: String, + val isbn: String, + val pages: Int +) : LibraryItem(id, title) { + override fun getItemType(): String = "Book" + override fun calculateLateFee(daysLate: Int): Double { + return daysLate * 0.5 + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/org/example/DVD.kt b/app/src/main/kotlin/org/example/DVD.kt new file mode 100644 index 0000000..b9a04df --- /dev/null +++ b/app/src/main/kotlin/org/example/DVD.kt @@ -0,0 +1,14 @@ +package org.example + +class DVD( + id: String, + title: String, + val director: String, + val duration: Int, + val genre: String +) : LibraryItem(id, title) { + override fun getItemType(): String = "DVD" + override fun calculateLateFee(daysLate: Int): Double { + return daysLate * 1.0 + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/org/example/LibraryItem.kt b/app/src/main/kotlin/org/example/LibraryItem.kt new file mode 100644 index 0000000..a0f790e --- /dev/null +++ b/app/src/main/kotlin/org/example/LibraryItem.kt @@ -0,0 +1,16 @@ +package org.example + +abstract class LibraryItem( + val id: String, + val title: String, + var isAvailable: Boolean = true +) { + abstract fun getItemType(): String + abstract fun calculateLateFee(daysLate: Int): Double + + open fun displayInfo(): String { + return "ID: $id, Title: $title, Available: $isAvailable" + } + + +} \ No newline at end of file diff --git a/app/src/main/kotlin/org/example/Magazine.kt b/app/src/main/kotlin/org/example/Magazine.kt new file mode 100644 index 0000000..a273bbb --- /dev/null +++ b/app/src/main/kotlin/org/example/Magazine.kt @@ -0,0 +1,13 @@ +package org.example + +class Magazine( + id: String, + title: String, + val issueNumber: Int, + val publisher: String +) : LibraryItem(id, title) { + override fun getItemType(): String = "Magazine" + override fun calculateLateFee(daysLate: Int): Double { + return daysLate * 0.25 + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/org/example/Main.kt b/app/src/main/kotlin/org/example/Main.kt new file mode 100644 index 0000000..74009e6 --- /dev/null +++ b/app/src/main/kotlin/org/example/Main.kt @@ -0,0 +1,24 @@ +/* + * This source file was generated by the Gradle 'init' task + */ +package org.example + +fun main() { + val member1= Member("M1", "S", "s") + member1.setName("Smith") + member1.setEmail("smith.com") + member1.setEmail("smith@gmail.com") + + val book1 = Book("B1", "Harry Potter", "JK", "1111-222", 122) + member1.borrowItem(book1) + + val member2 = Member("M2", "John", "john@gmail.com") + member2.borrowItem(book1) + + member2.returnItem(book1) + member1.returnItem(book1) + member2.borrowItem(book1) + member1.totalLateFees(15) + member2.totalLateFees(15) + +} diff --git a/app/src/main/kotlin/org/example/Member.kt b/app/src/main/kotlin/org/example/Member.kt new file mode 100644 index 0000000..646982a --- /dev/null +++ b/app/src/main/kotlin/org/example/Member.kt @@ -0,0 +1,64 @@ +package org.example + +class Member( + private val memberId: String, + private var name: String, + private var email: String +) { + private val borrowedItems = mutableListOf() + + fun getMemberId(): String = memberId + fun getName(): String = name + fun getEmail(): String = email + + fun setName(memberName: String) { + name = memberName + println("Member Name set to $name") + } + fun setEmail(memberEmail: String) { + if( + memberEmail.contains('@') + && + memberEmail.contains('.') + ) { + email = memberEmail + println("Member Email set to $email") + } else { + println("invalid email") + } + } + + fun borrowItem(item: LibraryItem) { + if(item.isAvailable) { + borrowedItems.add(item) + item.isAvailable = false + println("Member $memberId $name borrowed item ${item.id} ${item.title}") + } + else { + println("item unavailable") + } + } + + fun returnItem(item: LibraryItem) { + if(borrowedItems.contains(item)) { + borrowedItems.remove(item) + item.isAvailable = true + println("Member $memberId $name returned item ${item.id} ${item.title}") + } else { + println("Member $memberId $name did not borrow this item") + } + } + + fun totalLateFees(daysLate: Int) { + if(borrowedItems.isEmpty()) { + println("no items borrowed") + } + else { + var total = 0.0 + borrowedItems.forEach { item -> + total += item.calculateLateFee(daysLate) + } + println("Total Late Fees = $$total") + } + } +} \ No newline at end of file From b693c3d345fb070e7218a654d22a540aced3ae78 Mon Sep 17 00:00:00 2001 From: asadlodhi Date: Wed, 27 Aug 2025 20:25:29 +0500 Subject: [PATCH 2/2] Collections & HashMaps Created Library Class which holds collections of Items by Id, Items by Category, Members and performs Borrowed Items tracking with HashMaps --- app/src/main/kotlin/org/example/Library.kt | 45 ++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 app/src/main/kotlin/org/example/Library.kt diff --git a/app/src/main/kotlin/org/example/Library.kt b/app/src/main/kotlin/org/example/Library.kt new file mode 100644 index 0000000..15e8de5 --- /dev/null +++ b/app/src/main/kotlin/org/example/Library.kt @@ -0,0 +1,45 @@ +package org.example + +class Library { + // Map of item id to LibraryItem + private val itemsById = HashMap() + + // Map of category to list of LibraryItems in category + private val itemsByCategory = HashMap>() + + // Map of memberId to Member + private val members = HashMap() + + // Map of memberId to Member.borrowedItems + private val borrowedItems = HashMap>() + + //library.addItem(Book("B001", "The Kotlin Guide", "John Doe", "978-1234567890", 300)) + fun addItem(item: LibraryItem) { + itemsById[item.id] = item + itemsByCategory[item.getItemType()]?.add(item) + } + //library.registerMember(Member("M001", "Alice Johnson", "alice@email.com")) + fun registerMember(member: Member) { + members[member.getMemberId()] = member + } + //borrowItem("M001", "B001") + fun borrowItem(memberId: String, itemId: String) { +// val member = members.get(memberId) +// val item = itemsById.get(itemId) +// +// member?.borrowItem(item) + + borrowedItems[memberId]?.add(itemId) + + } + + fun returningItem(itemId: String) { + + } + + //library.findBooksByAuthor("John Doe") + fun searchItemByCriteria() { + + } + +} \ No newline at end of file