java - Java中 protected 类结构?

标签 java oop class inheritance

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

 public class Subclass extends protected Superclass

什么的。我举个例子。

这是你的父类(super class)。

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 的私有(private)实例并拥有类似这样的东西:

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){...}
}

您能否以一种不需要重新声明任何方法的方式同时接受这两种方法?

最佳答案

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

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

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

关于java - Java中 protected 类结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/740873/

相关文章:

java - 绑定(bind)Spring的HibernateDaoSupport时如何设置数据源

java - 使用 com.zaxxer.hikari.HikariDataSource 时出错

c++ - 继承:包含派生类实例的基类模板容器

matlab - 在 Matlab 中索引 map 的 map

javascript - 在 javascript 中创建一个带有方法的类

class - 从协议(protocol)调用类方法作为参数

java - DBCP 返回关闭的连接

java - 多个ClassLoader如何从不同位置加载同名资源?

PHP:自动加载有问题

java - 在java中重写三元组类的equals和hashcode