【问题标题】:Protected class structure in Java?Java中受保护的类结构?
【发布时间】:2010-10-18 23:01:00
【问题描述】:

我想知道 Java 中是否有一种语言特性,其中超类的方法对于子类的成员是不可见的:

 public class Subclass extends protected Superclass

什么的。我举个例子吧。

这是你的超类。

public class A{
    public String getA(){...}
    public String getB(){...}
    public String getC(){...}
    public void setA(String a){...}
    public void setB(String b){...}
    public void setC(String c){...}
}

如果您想在保护 A 的某些方法的同时继承 A,并且除非您覆盖它们,否则您无法更改方法中的访问修改器,那么您最终会得到类似这样的东西-

public class B extends A{
    private String getA(){return super.getA();}
    private String getB(){return super.getB();}//These four methods have
    private void setA(String a){super.setA(a);}//to be redeclared.
    private void setB(String b){super.setB(b);}

    public String getC(){return super.getC();}//These two methods can be
    public void setC(String c){super.setC(c);}//removed.
    public String getD(){...}
    public void setD(String d){...}
}

或者您可以保留 A 的私有实例并拥有如下内容:

public class B{

    private A obj;

    private String getA(){return obj.getA();}
    private String getB(){return obj.getB();}//These four methods can also
    private void setA(String a){obj.setA(a);}//be removed.
    private void setB(String b){obj.setB(b);}

    public String getC(){return obj.getC();}//These two methods are
    public void setC(String c){obj.setC(c);}//redeclared.
    public String getD(){...}
    public void setD(String d){...}
}

你能有一些东西以一种你不必重新声明任何方法的方式来接受吗?

【问题讨论】:

    标签: java oop class inheritance


    【解决方案1】:

    我认为不可能或不应该。

    如果您使用继承使 B 扩展 A,您应该能够将 B 对象用作 A 对象。例如,这是可能的:

    A obj = new B();
    

    现在程序无法知道您不能调用 A 的某些公共方法。

    如果没有继承,函数的重新定义是不可避免的。

    【讨论】:

      【解决方案2】:

      除了在超类中将字段/方法设置为私有之外,我认为没有办法解决这个问题。

      我认为你最好的选择是你的第二个选项,其中 B 类拥有对 A 类的私有引用。

      【讨论】:

        【解决方案3】:

        Java 中没有“非公共”继承,这与 C++ 中的情况不同。

        继承创建子类型关系。 B 的任何实例也是 A 的实例,并且应该响应相同的消息。如果 B 的实例显然没有响应 A 的实例响应的所有消息,那么无论如何继承都是不合适的。

        您的最后一个解决方案(B 不从 A 继承)是合适的解决方案:您不创建子类型关系,只需使用一种类型(秘密)实现另一种。

        【讨论】:

        • +1 用于与 C++(具有受保护和私有继承)进行比较。
        • 我以前教高级C++的时候,画维恩图来展示子类型关系,展示子类内部和外部看到的东西,发现这个概念很有效。然而,我觉得往往麻烦多于值得。
        猜你喜欢
        • 2021-02-16
        • 2016-02-19
        • 2019-04-18
        • 1970-01-01
        • 2011-05-30
        • 2013-03-31
        • 2010-11-04
        • 2011-06-06
        • 2018-07-16
        相关资源
        最近更新 更多