System bankowy
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 108 z 110.
Wyzwanie
ŁatwyZbudujmy system bankowy modelujący rzeczywiste operacje finansowe z wykorzystaniem zasad OOP, które opanowałeś(-aś) w trakcie tego kursu. Utworzysz konta z różnymi zasadami, będziesz śledzić transakcje i zarządzać klientami — wszystko uporządkowane w wielu plikach.
Twój system bankowy będzie uporządkowany w sześciu plikach:
transaction.dart: Utwórz klasęTransaction, która reprezentuje niezmienny zapis operacji finansowej. Każda transakcja ma polafinal:type(String — "deposit", "withdrawal" lub "transfer"),amount(double) itimestamp(DateTime). NadpisztoString(), aby zwracała[type] $amount.account.dart: Utwórz abstrakcyjną klasęAccountz prywatnym polem_balance(double), numerem kontafinal(accountNumber— String) oraz elementemList<Transaction>do przechowywania historii transakcji. Dodaj getter salda, chroniony setterset balance(double value), aby podklasy w innych plikach mogły aktualizować saldo, abstrakcyjną metodębool canWithdraw(double amount), którą implementują podklasy, oraz następujące metody konkretne:deposit(double amount)— dodaje środki do salda, zapisuje transakcję i wyświetlaDeposited $amount. Balance: $balancewithdraw(double amount)— jeślicanWithdraw()zwraca true, odejmuje środki od salda, zapisuje transakcję i wyświetlaWithdrew $amount. Balance: $balance. W przeciwnym razie wyświetlaWithdrawal denied.getTransactionCount()— zwraca liczbę transakcji
savings_account.dart: Utwórz klasęSavingsAccountrozszerzającą klasęAccount. Konta oszczędnościowe mają limit wypłat — nie można wypłacić więcej niż 500 USD w ramach jednej transakcji. ZaimplementujcanWithdraw(), aby egzekwować tę zasadę (upewnij się też, że saldo jest wystarczające). Dodaj metodęapplyInterest(double rate), która zwiększa saldo o podany procent, używając gettera i setterabalance, a następnie wyświetlaInterest applied. Balance: $balance.checking_account.dart: Utwórz klasęCheckingAccountrozszerzającą klasęAccount. Konta bieżące mają ochronę przed debetem do 100 USD — ich saldo może być ujemne, ale nie niższe niż -100 USD. ZaimplementujcanWithdraw(), aby umożliwiała wypłaty, o ile wynikowe saldo pozostaje na poziomie co najmniej -100 USD.customer.dart: Utwórz klasęCustomerz polamiid(String),name(String) oraz elementemList<Account>przechowującym konta klienta. Dodaj metodyaddAccount(Account account), która dodaje konto, orazgetTotalBalance(), która zwraca sumę sald wszystkich kont. NadpisztoString(), aby zwracałaCustomer: name (X accounts).main.dart: Zademonstruj działanie systemu bankowego. Utwórz klienta (C001,John Smith). Utwórz kontoSavingsAccount(SAV001, saldo początkowe 1000 USD) oraz kontoCheckingAccount(CHK001, saldo początkowe 500 USD). Dodaj oba konta do klienta i wyświetl klienta. Następnie wykonaj te operacje:- Wpłać 200 USD na konto oszczędnościowe
- Wypłać 300 USD z konta oszczędnościowego (powinno się udać)
- Spróbuj wypłacić 600 USD z konta oszczędnościowego (wypłata powinna zostać odrzucona — przekracza limit)
- Dodaj 5% odsetek do konta oszczędnościowego
- Wypłać 550 USD z konta bieżącego (powinno się udać dzięki ochronie przed debetem)
- Spróbuj wypłacić kolejne 100 USD z konta bieżącego (wypłata powinna zostać odrzucona — przekroczyłaby limit debetu)
Savings transactions: XorazTotal balance: $Y(sformatowane do 2 miejsc po przecinku).
Oczekiwany wynik:
Customer: John Smith (2 accounts)
Deposited $200.0. Balance: $1200.0
Withdrew $300.0. Balance: $900.0
Withdrawal denied
Interest applied. Balance: $945.0
Withdrew $550.0. Balance: $-50.0
Withdrawal denied
Savings transactions: 3
Total balance: $895.00Spróbuj swoich sił
import 'transaction.dart';
import 'account.dart';
import 'savings_account.dart';
import 'checking_account.dart';
import 'customer.dart';
void main() {
// TODO: Utwórz klienta o identyfikatorze "C001" i imieniu i nazwisku "John Smith"
// TODO: Utwórz SavingsAccount z accountNumber "SAV001" i saldem początkowym $1000
// TODO: Utwórz CheckingAccount z accountNumber "CHK001" i saldem początkowym $500
// TODO: Dodaj oba konta do klienta
// TODO: Wyświetl dane klienta
// TODO: Wykonaj następujące operacje:
// 1. Wpłać $200 na konto oszczędnościowe
// 2. Wypłać $300 z konta oszczędnościowego (operacja powinna się powieść)
// 3. Spróbuj wypłacić $600 z konta oszczędnościowego (operacja powinna zostać odrzucona — przekracza limit)
// 4. Nalicz 5% odsetek na koncie oszczędnościowym
// 5. Wypłać $550 z konta bieżącego (operacja powinna się powieść dzięki debetowi)
// 6. Spróbuj wypłacić kolejne $100 z konta bieżącego (operacja powinna zostać odrzucona — przekroczyłaby limit debetu)
// TODO: Wypisz "Savings transactions: X", gdzie X oznacza liczbę transakcji
// TODO: Wypisz "Total balance: \$Y", gdzie Y jest sformatowane do 2 miejsc po przecinku
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP
Pliki zewnętrzneBiblioteki i importyWprowadzenie do OOPKlasy a obiektySłowo kluczowe thisMetodyZmienne instancjiPodstawy konstruktorówPowtórka – prosty kalkulator4Bezpieczeństwo wartości null
Wprowadzenie do bezpieczeństwa wartości nullTypy dopuszczające null i niedopuszczające nullOperatory ? i !Słowo kluczowe late a bezpieczeństwo wartości nullOperatory uwzględniające nullBezpieczeństwo wartości null w klasachPodsumowanie — system profili użytkowników7Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjneMetody abstrakcyjneInterfejsy w DartInterfejsy niejawneImplementowanie a rozszerzanieWiele interfejsówPowtórka — kalkulator kształtów10Kolekcje i typy generyczne
Przegląd List, Set i MapKolekcje bezpieczne typowoKlasy generyczneMetody generyczneOgraniczenia typów generycznychIterable i IteratorPowtórka — generyczne przechowywanie danych13Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieMetody rozszerzająceKlasy wywoływalneKlasy zapieczętowane (Dart 3)Rekordy (Dart 3)Wzorce i dopasowywanie (3.0)Typy wyliczeniowe z metodami16Projekt: Zarządzanie biblioteką
Omówienie projektuKlasy książek i użytkowników2Konstruktory w Dart
Konstruktor domyślnyKonstruktory nazwaneListy inicjalizująceKonstruktory stałeKonstruktory fabryczneKonstruktory przekierowującePodsumowanie — budowanie kształtów5Hermetyzacja
Elementy publiczne a prywatneKonwencja prefiksu _Prywatność na poziomie bibliotekiGettery i settery — szczegółowoUkrywanie informacjiPodsumowanie — dane uczniów8Domieszki
Wprowadzenie do domieszekTworzenie domieszekKorzystanie z wielu domieszekSłowo kluczowe on w domieszkachDomieszka a dziedziczenieDomieszka a interfejsPodsumowanie – system zwierząt11Metody specjalne
Nadpisanie toString()Nadpisanie hashCode i ==Interfejs ComparableMetoda call()Nadpisanie noSuchMethodPodsumowanie — własna kolekcja14Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy3Właściwości klas
Elementy instancji a elementy statycznePola final i constZmienne inicjalizowane z opóźnieniemMetody i pola statyczneGettery i setteryPowtórzenie – menedżer kont bankowych6Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superPrzesłanianie metodAdnotacja @overrideSłowo kluczowe final dla klasKonstruktory i dziedziczeniePowtórzenie – hierarchia pracowników9Polimorfizm
Podstawy polimorfizmuPolimorfizm za pomocą interfejsówSprawdzanie typu w czasie działaniaOperatory is i asSłowo kluczowe covariantPodsumowanie — procesor płatnościPoćwicz samodzielnie: Kompilator Dart online