我有两个课程Parent
和Child
,而Parent
有一个需要3个参数的构造函数:
class Parent{
public Parent(String host,String path,int port){
}
}
现在我希望Child
构造函数只需要一个参数,然后我尝试做这样的事情:
class Child extend Parent{
public Child(String url){
String host=getHostFromUrl(url);
String path=....
String port=...
super(host,path,port);
}
}
但这不起作用。
有什么想法来解决它吗?
顺便说一句,我无法访问Parent
课程。
答案 0 :(得分:12)
对super
的调用必须是构造函数体中的第一个语句。来自section 8.8.7 of the JLS:
构造函数体的第一个语句可能是对同一个类或直接超类(§8.8.7.1)的另一个构造函数的显式调用。
你只需要内联电话:
public Child(String url) {
super(getHostFromUrl(url), getPathFromUrl(url), getPortFromUrl(url));
}
或者,将解析为一些更清晰的URL表示,并调用同一个类中的另一个构造函数:
public Child(String url) {
this(new URL(url));
}
// Or public, of course
private Child(URL url) {
super(url.getHost(), url.getPath(), url.getPort());
}
(我没有检查这些成员是否适用于java.net.URL
- 这更多是通过一种方法而不是细节。根据您的实际要求进行调整。)
答案 1 :(得分:1)
尝试类似
的内容public class Parent {
public Parent(String host, String path, int port) {
}
}
class Child extends Parent {
public Child(String url) {
super(getHost(url), getPath(url), getPort(url));
}
static String getHost(String url) {
// Logic to calculate host
return url;
}
static String getPath(String url) {
// Logic to calculate path
return url;
}
static int getPort(String url) {
// Logic to calculate port
return 8080;
}
}