簡體   English   中英

從另一個類調用方法以在 switch 語句中使用

[英]Calling method from another class to use in switch statement

我試圖從我的UserController類調用一個方法到我的MainController 但是,我似乎無法實例化我的方法,因此調用它已被證明非常困難。

此外,我正在調用的方法將在 switch 語句中使用。 這會影響我應該如何去做嗎?

createUser方法。 該方法以代碼方式工作(嘗試在MainController使用它)我只是不知道如何在不通過 switch 語句的情況下實例化它。

  public static void createUser(){


   String username, password, repeatPassword, height, weight, address, email;

               int age, choice;
               double fitnessIndex; 

               String [] rank = {"Guld", "Platinum", "Diamond"};
               String [] sex = {"Mand","Kvinde"};

                System.out.println("Udfyld følgende for at blive oprettet som bruger: \n ");

                System.out.print("Navn:\n");
                username = input.nextLine();

                System.out.println("E-mail:  ");
                email = input.next();


                // Regular expression som presierer hva emailen skal inneholde for å være valid

                while (!email.matches("([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\.\\.]+)\\.([a-zA-Z]{2,5})")) {
                    System.out.print("Ugyldig Email, prøv igjen\n");
                    email = input.next(); }


                System.out.println("Alder:  ");
                age = input.nextInt();



                // Brugeren velger mellom 2 predefinerte koen
                do {
                    System.out.println("Vælg dit koen: ");
                    data.printArray1(sex);
                    choice = input.nextInt();
                } while (choice < 1 || choice > sex.length);



                System.out.println("Hoejde:   ");
                height = input.next();

                System.out.println("Vaegt:  ");
                weight = input.next();

                System.out.println("Adresse:   ");
                address = input.next();

                System.out.println("Kondital:  ");
                fitnessIndex = input.nextDouble();



                // Brugeren velger mellom 3 predefinerte muligheter for medlemsskab

                do {
                    System.out.println("Vælg ranken som passer deg bæst: ");
                    data.printArray(rank);
                    choice = input.nextInt();
                } while (choice < 1 || choice > rank.length);


                //beder brugeren om at vælge og gentage sitt kodeord


                do {
                    System.out.println("Kodeord:  ");
                    password = input.next();

                    System.out.println("Gentag kodeord  ");
                    repeatPassword = input.next();

                    if (!password.equals(repeatPassword)) {
                        System.out.println("Kodeordet er forkert, prøv igen!");
                    }
                } while (!password.equals(repeatPassword));

                User Unapproved = new User(username, password, 1, age, sex[choice-1], height, weight, fitnessIndex, address, email, rank[choice-1]);
                data.getUnapproveds().add(Unapproved);

                System.out.println("\nDu er nu blivet oprettet som medlem og venter på godkenning ");
                System.out.println("Så snart du er godkent vil du kunne logge inn, Velkommen til Motion CBS!🏋️\n");

        } 

Switch 語句和我試圖調用MainController的方法

            do try {
            choice = input.nextInt();
            input.nextLine();
            switch(choice) {
                case 1:
                    login();
                    break;

                case 2:
                    createUser(); // opret medlemskab
                    break;

                case 3:
                    login();
                    break;

                case 4:
                    onExit();
                    break;

                default:
                    System.out.println("Ugyldigt valg! Prøv igen");
                    break;
            }
        } catch (InputMismatchException eObject) {
            System.out.println("\n Du har indtastet en forkert variabel og bliver nu returnert til stratsiden");
            input.nextLine();
        printStartMenu();
    }

    while (currentUser != null);
}

{
   UserController userController = new UserController();
   userController.createUser();  }

所以再次澄清。 該方法不會被調用,因為我不知道如何首先在UserController實例化該方法。 所以最底部的 CreateUser 是 RED(不工作)

因此 switch 語句中的第 2 點不起作用。 感謝任何幫助和提示,因為我想了解我缺少什么以及為什么

編輯我現在明白我沒有提供足夠的信息所以我會在這里補充

UserController 擴展了 MainController

 public class UserController extends MainController {

/**
 * The class constructor. Initializes the class and
 * its super class with instanses of the {@link MainController#data}
 * and {@link MainController#currentUser} objects.
 *
 * @param data        The instantiated data object.
 * @param currentUser The instantiated currentUser object.
 */
public UserController(Data data, User currentUser) {
    super(data, currentUser);
}

主控制器

protected Scanner input = new Scanner(System.in);

/** An instance of the Data class that holds all of the program data */
protected Data data;

/**
 *  The user currently logged in to the program.
 *  Defaults to null if no user is logged in.
 */
protected User currentUser;

/**
 * Default constructor for the Main Controller.<br>
 * Should <b>ONLY</b> be called from the Main Class, and only once.
 */

public MainController() {
    this.data = new Data();
}

/**
 * Constructor for instantiating when the Main Controller,
 * is the parent of a child controller.
 *
 * @param data          A reference to the instantiated Data object.
 * @param currentUser   A reference to the instantiated User object.
 */
public MainController(Data data, User currentUser) {
    this.data = data;
    this.currentUser = currentUser;
}

由於createUser方法是靜態的,您可以使用該方法所在的類(在本例中為UserController在主控制器內部調用它。

case 2:
       UserController.createUser(); 
       break;

編輯:新添加的代碼看起來不錯。 因為我沒有 Data 和 User 類,所以我假設有什么問題,但同時我可以就代碼方面給出一些觀點,以清除您可能遇到的任何問題,比如這個。 您必須知道大部分事情,但以防萬一清除您面臨的任何困惑:

我完全不知道如何解決覆蓋和擴展

extends 是用於繼承類的關鍵字。 在當前上下文中UserController是一個子類/子類,而MainController是超類/父類。 繼承是形成類之間的關系。 您可以使用它來繼承已經在類(MainController)中編寫的代碼,因此您不需要在需要相同屬性的新創建的類(UserController)中鍵入相同的內容。

例如:我的父母是一個人。 我(孩子)是一個人。 我從我的父母那里繼承了一個人的品質(我的父母從他們的父母那里繼承了他們的品質等等)。

重要的是要注意構造函數不能被繼承,這就是為什么在UserController構造函數內的代碼中,您使用super關鍵字來調用MainController構造函數並將值傳遞給它。 可以繼承字段(私有字段除外)和方法(構造函數除外)。

我完全不知道如何解決覆蓋和擴展

覆蓋意味着你從你的父級繼承了一些東西,但你不想要它的原樣以及修改實現的內容。

例如:假設您從父母那里繼承了一家珠寶店。 但是你不喜歡它,所以你選擇把它改造成一家茶館。

一個小程序會更好地解釋它:

父類

public class parent {

public void wakeUp()
{
    System.out.println("I will wake up at 6am");
}

}

這是我們的父類,它包含一個名為wakeUp 的方法。 父母會在早上 6 點醒來,所以如果這個父母有孩子,那么默認情況下,父母會讓孩子在同一時間(早上 6 點)醒來。 換句話說,孩子將默認繼承父母的品質。 您不需要在子類中編寫任何代碼來獲得這種質量(您只需要繼承父類)。 這就像說這是我的父母,所以默認情況下我將從我的父母那里獲取所有屬性,這里是代碼:

public class Child extends parent{


}

正如我們所看到的,我們還沒有在子類中寫任何東西。 但是我們使用了 extends 關鍵字,它聲明名為Child的類是名為Parent的類的子類。

現在,覆蓋是當孩子想要不同的實現時。 就好像說在某些事情上我和我父母有不同的看法。

例如:

public class Child extends parent{

@Override
public void wakeUp()
{
    System.out.println("I will wake up at 10am");
}

}

在這里,我們在子類中定義了相同的方法。 喚醒是質量,這個孩子不喜歡在早上 6 點醒來,所以孩子已經覆蓋了稱為喚醒()的質量(方法),並在方法體內提供了它自己的實現。 孩子修改/覆蓋了它從父母那里得到的質量。 但父母的素質並沒有改變。 父母早上 6 點起床,孩子早上 10 點起床。 我希望這可以幫助你。

從這里可以清楚地看出,如果我們想要相同的實現/質量,我們不需要覆蓋方法。 因此,在 MainController 中寫入的任何內容都由 UserController 繼承(除了我們之前所說的一些例外)。

由於您似乎正在為繼承而苦苦掙扎,以及您可以從超類中做什么和不能做什么,我建議現在最好的解決方案是將方法createUserUserController移動到MainController並從聲明中刪除static ,然后簡單地刪除UserController類(當然也可以移動任何其他方法)。

這將使您只剩下一個類,您可以專注於讓您的應用程序按您想要的方式運行。 僅僅為了繼承而引入繼承是沒有意義的,而且是過度工程化的,一旦你的應用程序運行了一個沒有錯誤的版本,那么你就可以開始考慮重構你的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM