Rückblick – Zahlungsmethoden
Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 36 von 57.
Aufgabe
SchwerErstelle einen Checkout mit Polymorphie, einer abstrakten Methode und Duck Typing. PaymentMethod#charge(amount) ist eine Template-Methode: Sie gibt nil zurück, wenn available?(amount) false ist, und gibt andernfalls card paid 50.00, fee 1.00 zurück, wobei label und die abstrakte Methode fee(amount) verwendet werden, die in PaymentMethod NotImplementedError auslöst. available? ist ein Hook, der true zurückgibt. Card berechnet eine Gebühr von 2 %; PayPal 0.30 plus 3 %; GiftCard.new(balance) berechnet keine Gebühr, ist nur verfügbar, solange das Guthaben den Betrag abdeckt, und verringert das Guthaben. Voucher.new(value) ist kein PaymentMethod: Es verfügt nur über ein eigenes charge(amount), das voucher covered 20.00 zurückgibt, wenn der Wert den Betrag abdeckt, und andernfalls nil. Der Helfer checkout(amount, methods) in functions.rb versucht die Methode charge jedes Zahlungsmittels der Reihe nach und gibt das erste Ergebnis oder declined zurück.
Die erste Eingabezeile listet die Zahlungsmethoden auf, zum Beispiel gift:30,voucher:20,card. Jede folgende Zeile enthält einen Bestellbetrag; der bereitgestellte Code gibt für jeden Betrag das Ergebnis von checkout aus.
Dein Code gehört in payment_method.rb, card.rb, pay_pal.rb, gift_card.rb, voucher.rb und functions.rb. main.rb enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
require_relative 'payment_method'
require_relative 'card'
require_relative 'pay_pal'
require_relative 'gift_card'
require_relative 'voucher'
require_relative 'functions'
# Bereitgestellter Ein-/Ausgabe-Code: belasse ihn wie er ist
input = []
while (line = gets)
input << line.chomp
end
methods = input[0].split(",").map do |entry|
kind, value = entry.split(":")
case kind
when "card" then Card.new
when "paypal" then PayPal.new
when "gift" then GiftCard.new(value.to_f)
else Voucher.new(value.to_f)
end
end
input.drop(1).each { |line| puts checkout(line.to_f, methods) }
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenInstanzvariablenMethoden und selfto_s und inspectRückblick – Bibliotheksausweis4Kapselung
Private MethodenGeschützte MethodenPrivate SetterZustand schützenRückblick – Verkaufsautomat7Polymorphismus und Duck Typing
PolymorphismusDuck TypingAbstrakte MethodenFälle und KlassenRückblick – Zahlungsmethoden2Getter und Setter sowie self
Leser und SchreiberBenutzerdefinierte Setterself in MethodenIdentität und GleichheitWiederholung – Kontaktliste5Vererbung
UnterklassenMethoden überschreibensuper aufrufenis_a? und VorfahrenRückblick – Gehaltsabrechnung des Personals8Spezielle Methoden
Gleichheit und HashOperator-MethodenIndexieren und AnhängenBenutzerdefinierte CollectionsRückblick – Brüche11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Online-Ruby-Compiler