簡體   English   中英

實現相同接口的多個類的方法相同

[英]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;
    }
}

所以打破..

  1. 有沒有辦法將getName的代碼放在一個地方,每個類都有自己的名稱變量?

  2. 有沒有辦法使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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM