【问题标题】:How to access child's field from the interface in Java?如何从 Java 中的接口访问子字段?
【发布时间】:2018-03-13 06:29:03
【问题描述】:

Java 8 引入了允许描述方法主体的“默认方法”。

我想创建一个接口和两个子类。在接口 URL 中,我希望有 getURL() 方法:

public interface URL {
    int getURL() {
        return this.myURL;
    } // obviously
}

我想在两个子类中定义 myURL 字段:

public class MyURL1 implements URL {
     private String myURL = "http://test1.com";
}

public class MyURL2 implements URL {
     private String myURL = "http://test2.com";
}

将由 getURL 返回。

在 Java 中可以吗?

【问题讨论】:

    标签: java interface default-method


    【解决方案1】:

    你想要的方式:

    public interface URL {
        int getURL() {
            return this.myURL;
        } // obviously
    }
    

    假设你有一个状态,这在接口中是不允许的,因此我认为你需要考虑使用抽象类,例如:

    public abstract class URL {
    
        private String myUrl;
    
        public URL(String url) {
           this.myUrl = url;
        }
    
        public String getURL() {
            return this.myURL;
        } // obviously
    }
    

    然后

    public class MyURL1 implements URL {
          public MyURL1() {
             super("http://test1.com");
          }
    }
    

    【讨论】:

      【解决方案2】:

      不,这在 Java 中是不可能的。

      下一个类似的东西是抽象类:

      abstract class UrlHolder {
          private String url;
          protected UrlHolder(String u) { url = u; }
          public String getUrl() { return url; }
      }
      

      然后

      class UrlHolder1 extends UrlHolder {
          public UrlHolder1() {
              super("myurl1");
          }
      }
      class UrlHolder2 extends UrlHolder {
          public UrlHolder2() {
              super("myurl2");
          }
      }
      

      【讨论】:

      • 但是不会是下一个超级覆盖之前的url值的方式吗?
      • @paus UrlHolder1UrlHolder2 是独立的类,它们不会互相干扰。每个实例都有自己的url 字段,所有UrlHolder1 urls 都将设置为“myurl1”。请注意,由于它是私有的,因此它永远不会在对象的生命周期内被更改。
      • 是的,UrlHolder1 和 UrlHolder2 是分开的,但是带有 url 字段的父抽象类是常见的。这让我很困惑。
      猜你喜欢
      • 2016-01-14
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 2016-09-20
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多