繁体   English   中英

如何在这个用例中设计类?

[英]How to design classes in this use case?

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

  1. A可以访问B和C的成员
  2. B可以访问C的成员
  3. C无法访问A和B成员
  4. B 不能访问 A 的成员

如果我将 B,C 的成员声明为受保护并将所有类放入 package,我将无法执行第三个和第四个条件。 这里的方法应该是什么?

我可以看到大多数答案都提到我可以像 A <- B <- C 那样直接做 inheritance。但是,假设我们有像病人和医生这样的类。 因此,医生需要知道给定患者 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++ 中有类似的东西)但是有一些方法可以模拟这种行为。 例如阅读:

只是我不确定你的情况是否值得

像这样

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;
}

protected 字段对不同 package 中的子类可见,默认(package-private)字段仅对相同 package 中的子类可见。

查看文档

你可以在这里使用继承。 如果C是parent most class,那么B可以继承C,A可以继承B。那么在这个场景下,A可以访问他的parent B和parent的parent C,B可以访问他的parent C,而C不能访问A3.86或8810378658 B 不能访问 A,因为 B 是 A 的父级 class。

我想我应该提到我在写问题时正在考虑的确切用例。 我稍后相应地更新了我的问题。 对于我的用例,我认为聚合是正确的方法,而不是 inheritance,因为类具有 has-a 关系而不是 is-a。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM