2015-11-19 3 views
-1

Я беру класс, и они дали мне мою первую попытку использовать модуль в рубине для программы «Банковская учетная запись».Наследование дочерних классов с включенным модульным методом из родительских классов в Ruby

Вот вопрос ..

Создать модуль под названием Процентный. Проценты должны иметь метод calculate_interest (баланс, months, interest_amount), который устанавливает новый баланс учетной записи. Он умножает количество месяцев, начисленных на сумму процентов, добавляет их на баланс и возвращает новый баланс.

Давайте также создадим метод complex_interest, который не принимает никаких параметров. И SavingsAccount, и CheckingAccount должны реализовать complex_interest. Интерес к CheckingAccount составляет 10 долларов США каждый месяц и начисляется каждые три месяца. Проценты по SavingsAccount составляют 5 долларов США каждый месяц и начисляются каждые шесть месяцев. Используйте метод Interest.calculate_interest в методах complex_interest, чтобы установить новый баланс в учетной записи.

Тогда я дал этот код ...

module Interest 
end 

class BankAccount 
    include Interest 
end 

class CheckingAccount < BankAccount 
end 

class SavingsAccount < BankAccount 
end 

Я пытался в течение нескольких часов, чтобы понять, почему я не могу заставить его работать. Вот что я до сих пор.

module Interest 
    def calculate_interest(balance, months, interest_amount) 
    balance += (months*interest_amount) 
    balance 
    end 
end 

class BankAccount 
    attr_accessor :balance 

    include Interest 

    def initialize(balance) 
    @balance = balance 
    end 
end 

class CheckingAccount < BankAccount 
    def initialize(balance) 
    super(balance) 
    end 

    def compound_interest 
    balance = Interest.calculate_interest(balance, 3, 10) 
    balance 
    end 
end 

class SavingsAccount < BankAccount 
    def initialize(balance) 
    super(balance) 
    end 

    def compound_interest 
    balance = Interest.calculate_interest(balance, 6, 5) 
    balance 
    end 

end 

Я очень новичок в этом, поэтому я уверен, что мой код довольно простой, пожалуйста, извините. Во всяком случае, я получаю эту ошибку ...

NoMethodError 
undefined method `calculate_interest' for Interest:Module 
exercise.rb:24:in `compound_interest' 

exercise_spec.rb:31:in `block (3 levels) in <top (required)>' 

Если мои дочерние классы наследуют модульный метод, я не понимаю, как метод модуль не может быть найден при вызове на них.

Для дальнейшей ссылки здесь спецификации

describe BankAccount do 
    describe "initialization" do 
    it "takes an initial balance" do 
     acc = BankAccount.new(283) 
     expect(acc.balance).to eq(283) 
    end 
    end 

    describe "#new" do 
    it "returns the balance" do 
     acc = BankAccount.new(283) 
     expect(acc.balance).to eq(283) 
    end 
    end 
end 

describe CheckingAccount do 
    it "has BankAccount as its parent class" do 
    expect(CheckingAccount.superclass).to eq(BankAccount) 
    end 

    it "includes the module Interest" do 
    expect(CheckingAccount.ancestors).to include(Interest) 
    end 

    describe "#compound_interest" do 
    it "compounds the balance by the specified interest rate" do 
     acc = CheckingAccount.new(283) 
     new_balance = acc.compound_interest 
     expect(new_balance).to eq(283 + 3 * 10) 
     end 
    end 
end 

describe SavingsAccount do 
    it "has BankAccount as its parent class" do 
    expect(SavingsAccount.superclass).to eq(BankAccount) 
    end 

    it "includes the module Interest" do 
    expect(SavingsAccount.ancestors).to include(Interest) 
    end 

    describe "#compound_interest" do 
    it "compounds the balance by the specified interest rate" do 
     acc = SavingsAccount.new(283) 
     new_balance = acc.compound_interest 
     expect(new_balance).to eq (283 + 6 * 5) 
    end 
    end 
end 

Извините за то, что так длинно, я просто хочу, чтобы дать вам ту же информацию, у меня есть.

+0

Подсказка: какой объект являются функции вызова 'compound_interest' дальше? Какой объект * вы * вызываете 'complex_interest'? Каков класс объекта, на который вы вызываете 'complex_interest'? Имеет ли этот класс или любой из его предков метод 'complex_interest'? –

+0

К сожалению, «длительный» - это не то же самое, что «конкретный», совершенно наоборот. См. [Как создать минимальный, завершенный и проверяемый пример] (http://stackoverflow.com/help/mcve). В вашем вопросе есть много постороннего пуха, который не имеет отношения к проблеме и затрудняет понимание, где находится * актуальная * проблема.(Я только наткнулся на него удачей.) –

+0

Ты меня потерял. Я тоже не понимаю спецификации. –

ответ

0

эту запись (и другая точка, где calculate_interest называется) ...

balance = Interest.calculate_interest(balance, 3, 10) 

Это пытается вызвать метод, принадлежащий Interest модуля.

... но нет такого метода. Фактически, calculate_interest был включен в ваши классы через модуль и стал методом instance (метод, принадлежащий каждому экземпляру класса).

Правильный способ вызвать его из другого метода экземпляра без приемника

balance = calculate_interest(balance, 3, 10) 
+0

Я предполагаю, что я смущен, потому что инструкции говорят мне использовать 'Interest.calculate_interest' в этих методах. Я попробовал это решение, и он по-прежнему терпит неудачу с новой ошибкой. '' 'NoMethodError' ' undefined method '+ 'для nil: NilClass''' –

+0

Да, поздравляем, вы прошли первую ошибку! Кажется, что 'balance' содержит nil, поэтому вы не можете добавить к нему номер. Попробуйте ссылаться на метод attr_accessor' вместо создания локальной переменной. 'self.balance = calculate_interest (self.balance, 3, 10)' – SteveTurczyn

+0

Я понял это. Мне нужно было использовать переменную экземпляра @balance вместо «balance» в методе модуля. Наряду с вашими советами это работало. Благодаря! –

Смежные вопросы