Powtórzenie – metody płatności
Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 36 z 57.
Wyzwanie
TrudnyZbuduj proces realizacji płatności z użyciem polimorfizmu, metody abstrakcyjnej i typowania kaczego. PaymentMethod#charge(amount) to metoda szablonowa: zwraca nil, gdy available?(amount) jest fałszywe, a w przeciwnym razie zwraca card paid 50.00, fee 1.00, korzystając z label i abstrakcyjnej metody fee(amount), która zgłasza wyjątek NotImplementedError w klasie PaymentMethod. available? to metoda hakowa, która zwraca true. Card pobiera opłatę w wysokości 2%; PayPal — 0.30 plus 3%; GiftCard.new(balance) nie pobiera opłaty, jest dostępna tylko wtedy, gdy jej saldo pokrywa kwotę, i zmniejsza saldo. Voucher.new(value) nie jest obiektem klasy PaymentMethod: ma tylko własną metodę charge(amount), która zwraca voucher covered 20.00, gdy wartość pokrywa kwotę, a w przeciwnym razie nil. Funkcja pomocnicza checkout(amount, methods) w pliku functions.rb kolejno wywołuje metodę charge każdego sposobu płatności i zwraca pierwszy wynik albo declined.
Pierwszy wiersz wejścia zawiera listę sposobów płatności, na przykład gift:30,voucher:20,card. Każdy kolejny wiersz zawiera kwotę zamówienia; dostarczony kod wypisuje wynik wywołania checkout dla każdej z nich.
Twój kod umieść w plikach payment_method.rb, card.rb, pay_pal.rb, gift_card.rb, voucher.rb i functions.rb. Plik main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
require_relative 'payment_method'
require_relative 'card'
require_relative 'pay_pal'
require_relative 'gift_card'
require_relative 'voucher'
require_relative 'functions'
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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) }
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasZmienne instancjiMetody i selfto_s i inspectPowtórzenie – karta biblioteczna4Hermetyzacja
Metody prywatneMetody chronionePrywatne setteryOchrona stanuPowtórzenie – automat vendingowy7Polimorfizm i typowanie kacze
PolimorfizmTypowanie kaczeMetody abstrakcyjnecase i klasyPowtórzenie – metody płatności10Wzorce projektowe, część 2
Delegowanie z ForwardableWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Metody dostępowe i self
Gettery i setteryWłasne setteryself w metodachTożsamość i równośćPowtórzenie – lista kontaktów5Dziedziczenie
PodklasyNadpisywanie metodWywoływanie superis_a? i przodkowiePowtórka – lista płac pracowników8Metody specjalne
Równość i hashMetody operatorówIndeksowanie i dodawanieWłasne kolekcjePowtórka – ułamki11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Kompilator Ruby online