Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对类'使用抽象/超类;它的内部工作原理。wrt访问修饰符的良好实践_Java_Inheritance - Fatal编程技术网

Java 对类'使用抽象/超类;它的内部工作原理。wrt访问修饰符的良好实践

Java 对类'使用抽象/超类;它的内部工作原理。wrt访问修饰符的良好实践,java,inheritance,Java,Inheritance,我如何改变我错误的c#ish设计,以在java中使用合理的访问保护 这是我的超级班 abstract class Parent { protected parentVariable; protected parentMethod() { //These methods and variables contain internal workings of my sub-classes //to avoid repetition

我如何改变我错误的c#ish设计,以在java中使用合理的访问保护

这是我的超级班

abstract class Parent {
    protected parentVariable;

    protected parentMethod() {
          //These methods and variables contain internal workings of my sub-classes
          //to avoid repetition
          // I don't want classes elsewhere in the package (that don't inherit from class) to see these.
    }
}
我有一些共享内部工作的子类,我把它放在了超级类中。它对其他类仍然是隐藏的,并且可以被子类使用。等等,不,这不是c,这是java

 Protected(c#) != Protected(java) ≈≈ Internal(C#).
 c# protected = Access is limited to the containing class or types derived from the containing class.
 java protected = Access is limited to the current package
 Everything in the package can see access these. That's far too permissive for these internal workings. 

我如何解决这个问题?我是否必须将共享代码下放到子类中,并以代码重复为代价使用“private”?我对父类的使用一开始就是糟糕的设计吗?我必须把这些继承树保存在新的包中吗

没有访问修饰符允许查看子类,但不允许查看同一包的类

但这并不是什么大问题,因为给定包中的类应该是“朋友”、合作和同时发布的

即使他们看到一些不应该使用的字段和方法,包的其他类也不是您无法控制的任何外部API的一部分,并且外部代码无法访问受保护的方法


所以,只要记录这些方法和字段不应该被使用,这样你或你的同事就不会错误地使用它们。或者,如果您真的关心同一个包的可见性,请将该类放在自己的包中。

没有允许对同一个包的子类(而不是类)进行可见性的访问修饰符

但这并不是什么大问题,因为给定包中的类应该是“朋友”、合作和同时发布的

即使他们看到一些不应该使用的字段和方法,包的其他类也不是您无法控制的任何外部API的一部分,并且外部代码无法访问受保护的方法


所以,只要记录这些方法和字段不应该被使用,这样你或你的同事就不会错误地使用它们。或者,如果您真的关心同一个包的可见性,可以将此类放在自己的包中。

您可以通过不为它们指定任何访问修饰符(这是默认访问)将它们设置为包私有。受保护的内容对子类是可见的,无论它们是在同一个包中还是与父类不同的包中。您可以通过不为它们指定任何访问修饰符(这是默认访问)使它们成为私有包。受保护的内容对子类是可见的,无论是在同一个包中还是与父类不同的包中。谢谢。我想是的。我不想麻烦使用访问器方法,也不想使用getter来提醒自己不应该在外部更改的方法。或者是的,如果我真的介意的话,用另一个包裹。谢谢。我想是的。我不想麻烦使用访问器方法,也不想使用getter来提醒自己不应该在外部更改的方法。或者是的,如果我真的在乎的话,用另一个包裹。