[英]Same method for multiple classes that implement the same interface
對不起,我真的不知道如何標題,這是問題所在......
我有一個接口和多個實現接口的類。 接口中某些方法的實現在每個實現類中都是完全相同的。 我覺得應該有一種簡化方法,所以我不必每次都寫相同的代碼。 例:
public interface Foo {
String getName();
}
public class FooImpl1 implements Foo {
private String name = "foo name1";
public String getName() {
return name;
}
}
public class FooImpl2 implements Foo {
private String name = "foo name2";
public String getName() {
return name;
}
}
所以打破..
有沒有辦法將getName的代碼放在一個地方,每個類都有自己的名稱變量?
有沒有辦法使getName靜態,所以我不必創建一個新的實例
有更好的想法嗎?
使用抽象類並初始化構造函數中的字段:
public abstract class Foo {
protected String name;
String getName() {
return name;
}
}
public class FooImpl1 extends Foo {
public FooImpl1 () {
name = "foo name1";
}
}
public class FooImpl2 extends Foo {
public FooImpl1 () {
name = "foo name2";
}
}
JB Nizlet指出,做這樣的事情會更干凈:
public abstract class Foo {
protected String name;
public Foo(String newName) {
name = newName;
}
String getName() {
return name;
}
}
然后在子類中調用super("foo name 1")
。
正如@Peter Lawrey所說,如果您已經有一個界面或者出於其他原因需要一個界面:
public interface IFoo {
String getName();
}
public abstract class Foo implements IFoo {
protected String name;
String getName() {
return name;
}
}
你可以采取一個非常簡單的方法:
public interface Foo {
String getName();
}
public class Named implements Foo {
String name;
public String getName() {
return name;
}
}
public class FooImpl1 extends Named {
{name = "foo name1";}
}
public class FooImpl2 extends Named {
{name = "foo name2";}
}
它並不像你的例子那樣適用於getter,但由於問題更通用,我認為值得一提的是,使用Java 8,你可以在接口中定義默認方法 。 所以如果你有一些更復雜的東西,比如:
public interface ComplexFoo {
String getFirstName();
String getLastName();
String getFullName();
}
您不必在每個子類中重復getFullName
實現,但可以在接口中指定它:
public interface ComplexFoo {
String getFirstName();
String getLastName();
default String getFullName() {
return getFirstName() + " " + getLastName();
}
}
雖然getter仍然需要重復,因為它們訪問界面中尚未提供的成員:
public class FooImpl1 implements ComplexFoo {
private String firstName = "foo";
private String lastName = "name1;
private String getFirstName() { return firstName; }
private String getLastName() { return lastName; }
}
public class FooImpl2 implements ComplexFoo {
private String firstName = "foo";
private String lastName = "name2;
private String getFirstName() { return firstName; }
private String getLastName() { return lastName; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.