Как вызвать метод с параметрами в качестве объектов из другого класса java?

#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() методе)