我正在尝试从我的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;
}
答案 0 :(得分:0)
由于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点醒来,因此,该孩子重写了称为akeUp()的质量(方法),并在方法体内提供了它自己的实现。子级修改/覆盖了从父级获得的质量。但是父母的素质没有改变。父母将在早上6点醒来,孩子将在早上10点醒来。希望对您有帮助。
据此,对于我们来说很明显,如果我们想要相同的实现/质量,则不需要重写方法。因此,MainController内编写的任何内容都由UserController继承(我们前面已经说过一些例外)。
答案 1 :(得分:0)
由于您似乎在继承方面以及在超类中可以做和不能做的事情上苦苦挣扎,我建议目前最好的解决方案是将方法createUser
从UserController
移到{ {1}}并从声明中删除MainController
,然后简单地删除static
类(当然也可以移动任何其他方法)。
这将只剩下一堂课,您可以专注于让应用程序表现出所需的行为。仅仅出于继承的目的而引入继承是没有意义的,而且要经过工程设计,一旦拥有了运行中的无错误版本的应用程序,就可以开始考虑重构代码了。