2014-08-31 106 views
11

對不起,我真的不知道這個問題怎麼稱號,這裏的問題多類相同方法...爲實現相同的接口

我有一個接口和實現接口的多個類。接口中某些方法的實現在每個實現類中都完全相同。我覺得應該有一種方法來簡化它,所以我不必每次都編寫相同的代碼。例如:

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; 
    } 
} 

因此,要打破..

  1. 有沒有把爲getName的在一個地方的方式和每個類都有它自己的名字變量?

  2. 有沒有一種方法,使靜態的getName,所以我不必創建一個新的實例

有更好的想法?

+8

您可以定義一個抽象類,它是這兩個父級的抽象類,它包含名稱字段和get名稱方法。子類不需要實現它。 – 2014-08-31 21:16:22

回答

11

使用一個抽象類,在構造函數初始化場:

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; 
} 
} 
+2

+1如果你需要一個接口,抽象類可以實現接口。 – 2014-08-31 21:23:28

+0

在超類的構造函數中使用名稱並調用'super(name)' – 2014-08-31 21:37:44

+0

@JBNizet會更清晰。是的,它將編輯。 – 2014-08-31 21:38:01

1

你可以採取一個非常簡單的方法:

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";} 
} 
+0

這是有效的Java? – 2014-08-31 23:41:43

+0

@AnubianNoob - 假設你正在討論'{name = ...}'部分,那些[初始化塊](http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html )。另一方面,我總是發現詢問「這是否合法」的問題/評論是毫無意義的,因爲通常只需通過編譯器/解釋器就可以輕鬆地運行代碼,就像詢問它是否有效一樣,並且可以立即得到答案。 – DaoWen 2014-08-31 23:59:04

+0

我知道這是有效的。我問的是什麼叫(謝謝),甚至可能是一個鏈接(非常感謝)。 – 2014-09-01 00:00:55

0

它並沒有真正的工作對於你的例子中的getter來說,但因爲這個問題更通用,所以我認爲值得一提的是,在Java 8中,你可以定義default methods in interfaces。所以,如果你有一些更復雜的,如:

public interface ComplexFoo { 
    String getFirstName(); 
    String getLastName(); 

    String getFullName(); 
} 

您不必重複在每個子類中getFullName實現,但可以在界面中指定它:

public interface ComplexFoo { 
    String getFirstName(); 
    String getLastName(); 

    default String getFullName() { 
     return getFirstName() + " " + getLastName(); 
    } 
} 

的干將雖仍需要重複,因爲它們訪問接口中尚未提供的成員:

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; } 
} 
相關問題