#java #object #methods #call
#java #объект #методы #вызов
Вопрос:
Я пытаюсь НЕ просто вызвать метод, введя значения вручную, а запустить метод другого класса из другого класса. Я попытался найти решение, рассмотрев похожие вопросы, но они не помогли мне в этом контексте.
Возможно, я ошибаюсь, пожалуйста, простите меня, но это требование просит меня вызвать метод с параметрами, что я не понимаю, как это сделать.
Это требование:
а) Добавьте метод payForHoliday() в класс-член. Этот метод просто вызовет метод в классе Website для оплаты отпуска (т. Е. Для записи транзакции с веб-сайтом). И здесь у нас есть проблема, потому что объект из класса Member не хранит запись о том, на какой веб-сайт зарегистрирован участник.
Сайт класса:
public class Website {
private String websiteName;
private double salesTotal;
public Website(String newWebsiteName)
{
websiteName = newWebsiteName;
}
// lines omitted
public void checkout(Member purchase, Holiday chosen)
{
if (checkHitDiscount() == true)
{
System.out.println("Congrtulations you are eligible for 10% discount!");
salesTotal = chosen.price;
}
else
{
System.out.println("successful completion of the transaction");
salesTotal = chosen.price;
}
}
Член класса:
public class Member {
private String email;
public int membershipNumber;
Holiday holiday;
Website website;
public Member(String newEmail, int newMembershipNumber)
{
email = newEmail;
membershipNumber = newMembershipNumber;
}
// lines omitted
public void payForHoliday(Member purchase, Holiday chosen)
{
// This method needs to run the "checkout()" method in Website class
}
Ответ №1:
Прежде чем вы сможете выполнить (нестатический) член другого класса, вам нужен объект, который является экземпляром этого класса.
Другими словами, ваш метод проверки — это операция, которая выполняется на определенном веб-сайте, поскольку она определена как член класса Website .
Следовательно, для его вызова вам нужно
Website xyz = …. something that delivers a website …;
и тогда вы можете вызвать
xyz.checkout(…);
«Что-то, что обеспечивает веб-сайт» — это то, что соответствует дизайну вашего приложения. Может быть, это так же просто, как «новый веб-сайт ()», но невозможно сказать, не зная, что еще веб-сайт на самом деле представляет в вашем дизайне.
Вам не хватает подробностей о том, как это должно работать. Я приведу несколько предположений. Во-первых, я предполагаю, что существует больше членов, чем веб-сайтов, то есть, что каждый возможный веб-сайт имеет более одного члена.
Это означает, что должен быть способ подключить участника к веб-сайту. Требования указывают на это как на «проблему» — мы можем сделать вывод, что вы должны решить проблему.
Одним из способов было бы, чтобы конструктор-член сообщал вам веб-сайт:
public Member(String newEmail, int newMembershipNumber, Website newSite)
{
email = newEmail;
membershipNumber = newMembershipNumber;
website = newSite;
}
тогда вы можете сделать это:
public void payForHoliday(Member purchase, Holiday chosen)
{
website.checkout(purchase, chosen);
}
но для меня это не имеет большого смысла — зачем этому методу нужен аргумент ‘Member’, который отличается от элемента, который его содержит? Вы уверены, что правильно поняли эту деталь? Это более правдоподобно:
public void payForHoliday(Holiday chosen)
{
website.checkout(this, chosen); // 'this' means the current Member
}
Но предназначен ли этот подход или нет, мы не можем сказать, потому что в вопросе недостаточно подробностей. Как используются какие-либо из этих вещей? Что создает члены? Знает ли код, который создает элементы, о конкретном веб-сайте, для которого он создает элемент?
Комментарии:
1. Я уже пробовал этот способ, он требует от меня добавления строки, потому что у меня есть конструктор в классе Website , который инициирует имя веб-сайта. Проблема в том, что я не хочу обращаться к другим переменным, а только к
checkout()
методу в классе Website , по крайней мере, таково требование.2. @The_Liner Вы уверены, что это то, что задает требование? Метод может быть вызван только из экземпляра
Website
класса. Если для создания этого экземпляра вам нужно предоставить строку, я очень сомневаюсь, что требование обязывает вас не предоставлять эту строку. Фактически, в требовании упоминается только название веб-сайта, когда говоритсяMember
, что класс не отслеживает его, но в нем не говорится, что вы не должны предоставлять его каким-либо образом, например, через ввод пользователя. Возможно, вам следует обратиться за разъяснениями к тому, кто дал вам задание, если это возможно.3. Я обновил вопрос, включив поля и конструкторы. Я уже добавил
Website
class в качестве переменной экземпляра вMember
class (Website website).4. Что-то в члене должно назначить веб-сайт переменной экземпляра. Затем вы можете вызвать website.checkout(….).
5. Я все перепробовал, я не знаю, что делать. Он никогда не учил нас, как вызывать методы мутатора, а только методы доступа.
Ответ №2:
Проблема заключалась в том, что я пытался добавить объект того же класса Member
для вызова метода из другого класса Website
, который имел a Member purchase
в качестве параметра.
Итак, чтобы правильно вызвать этот метод, я использовал этот код:
public void payForHoliday(Holiday test)
{
website.checkout(this, test);
}
- Для указания на метод
checkout()
вWebsite
классе я использовалaddress
(Website website), объявленный какinstance variable
Member
класс in . this
Ключевое слово сообщает программе, что параметром является сам объект, который вызывает метод.test
Переменная помещается в качестве параметра из-за того, что является указателем из другого класса. (Я изменил имя переменной на другое имя, чтобы избежать конфликтов с именем вcheckout()
методе)