如何在这个用例中设计类

  • 本文关键字:设计类 java oop
  • 更新时间 :
  • 英文 :


我在java中有三个类-A、B、C。条件-

  1. A可以访问B和C的成员
  2. B可以访问C的成员
  3. C无法访问A和B的成员
  4. 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。

最新更新