[英]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 繼承(除了我們之前所說的一些例外)。
由於您似乎正在為繼承而苦苦掙扎,以及您可以從超類中做什么和不能做什么,我建議現在最好的解決方案是將方法createUser
從UserController
移動到MainController
並從聲明中刪除static
,然后簡單地刪除UserController
類(當然也可以移動任何其他方法)。
這將使您只剩下一個類,您可以專注於讓您的應用程序按您想要的方式運行。 僅僅為了繼承而引入繼承是沒有意義的,而且是過度工程化的,一旦你的應用程序運行了一個沒有錯誤的版本,那么你就可以開始考慮重構你的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.