Java 对类'使用抽象/超类;它的内部工作原理。wrt访问修饰符的良好实践
我如何改变我错误的c#ish设计,以在java中使用合理的访问保护 这是我的超级班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
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来提醒自己不应该在外部更改的方法。或者是的,如果我真的在乎的话,用另一个包裹。