我在java中有三个类-A、B、C。条件-
- A可以访问B和C的成员
- B可以访问C的成员
- C无法访问A和B的成员
- B无法访问A的成员
如果我将B、C的成员声明为受保护的,并将所有类放在一个包中,我将无法强制执行第3和第4个条件。这里应该采取什么方法?
我可以看到,大多数提到我可以像A<-那样直接做继承的答案B<-C.但是,假设我们有像病人和医生这样的课程。所以,医生需要知道患者给患者id的细节。从实施角度来看,如果我从患者扩展医生,这将解决用例。但是,从逻辑上讲,把医生从病人延伸出来对我来说是没有意义的,因为医生不是病人。
您应该为每个用例创建合适的接口,而不是使用类直接接受接口
例如,它可能看起来像
interface AccessibleA {
int getA();
void setA(int a);
// other methods declarations - non accessors
}
interface InaccessibleA {
// other methods declarations - non accessors
}
class A implements AccessibleA, InaccessibleA {
private int a;
// getter and setter
public A(AccessibleB b, AccessibleC c) {
// you can assign these values or use them
}
// other methods
}
// the same interfaces for B and C
class B implements AccessibleB, InaccessibleB {
private int b;
// getter and setter
public A(InaccessibleA a, AccessibleC c) {
// you can assign these values or use them
}
// other methods
}
// etc
不幸的是,在Java中;朋友功能";实现(C++中有类似的东西(,但是有一些方法可以嘲笑这种行为。例如:
- 有没有一种方法可以模拟C++;朋友';Java中的概念
只是我不确定在你的情况下值得
像这个
package c;
class C {
protected String foo;
}
package b;
class B extends C {
protected String bar;
}
package a;
class A extends B {
protected String baz;
}
受保护的字段对不同包中的子类可见,默认(包专用(字段仅对同一包中的个子类可见。
参见文件
您可以在此处使用继承。如果C是父类最多的类,B可以继承C,A可以继承B。因此,在这个场景中,A可以访问他的父母B和父母的父母C,B可以访问他的父亲C,而C不能访问A或B。B不能访问A,因为B是A的父类。
我想我应该提到我在写这个问题时思考的确切用例。我稍后相应地更新了我的问题。对于我的用例,我认为聚合而不是继承是正确的方法,因为类具有has-a关系而不是is-a。