클래스의 멤버에 대한 액세스를 차별적으로 제어하려면 어떻게해야합니까? 저는 세 가지 클래스가 있다고 가정 해 봅시다 :Java 클래스의 필드에 대한 가시성을 어떻게 제어합니까?
Class A
{
int a;
int b;
}
Class B
{
Access to only 'a' and not 'b'
}
Class C
{
Access to only 'b' and not 'a'
}
클래스의 멤버에 대한 액세스를 차별적으로 제어하려면 어떻게해야합니까? 저는 세 가지 클래스가 있다고 가정 해 봅시다 :Java 클래스의 필드에 대한 가시성을 어떻게 제어합니까?
Class A
{
int a;
int b;
}
Class B
{
Access to only 'a' and not 'b'
}
Class C
{
Access to only 'b' and not 'a'
}
한 가지 방법은 aspect 지향 프로그래밍을 사용하는 것입니다. 액세스중인 패키지 또는 클래스를 확인하고 액세스를 금지 할 수 있습니다.
AspectJ를 사용하면 웹 계층에서 지속성 계층의 클래스에 액세스하지 않고 서비스 계층에서만 액세스 할 수 있습니다.
http://blog.jayway.com/2010/03/28/architectural-enforcement-with-aid-of-aspectj/
C#의 경우 PostSharp는 가시성을 제어 할 수있는 비슷한면을 가지고 있습니다. ComponentInternal, InternalImplements 및 Internal의 예는 http://www.sharpcrafters.com/blog/post/Architectural-Validation.aspx를 참조하십시오. 그것들이 당신의 필요에 맞지 않는다면, 아마 당신이 쓸 수있는 것입니다. –
인터페이스 시간 :
이 같은interface IHaveA { int a {get;set;} }
interface IHaveB { int b {get;set;} }
Class A : IHaveA, IHaveB
{
public int a {get;set;}
public int b {get; set;}
}
Class B
{
IHaveA _iHaveA;
C(IHaveA iHaveA)
{
_iHaveA = iHaveA;
}
}
Class C
{
IHaveB _iHaveB;
C(IHaveB iHaveB)
{
_iHaveB = iHaveB;
}
}
그런까지 새로운 B와 C : 여기
static Main()
{
A a = new A();
B b = new B(a);
C c = new C(a);
}
이 디자인에서 클래스 B에도 'IHaveB _iHaveB'가 있으면 클래스 B는 'a'와 'b'에 모두 액세스 할 수 있습니다. 그것이 강하게 통제 될 수 있다고? –
@GurpreetSingh 어쩌면 클래스 B가 IHaveB를 필요로한다면 그것을 달성하려고하는 이유를 설명해야 할 것입니다. 그렇다면 왜 B에 액세스하려고하지 않으시겠습니까? 나에게 이상한 소리! –
정말 원유 생각이 여기에 예입니다.
가지고는
class A
{
int a;
int b;
void getAObserver(B bInstance);
void getBObserver(C cInstance);
}
이 다음은 aWasUpdated 또는 bWasUpdated 같은 함수를 호출 할 수있는 A. 유래 관찰자를 취할 B 유래의 옵저버를 수행하는 기능과 다른 기능을 가질 경우에 따라 구성원을 특정 클래스에 공개 된 psuedo 유형으로 만듭니다. 이 구현
정말 원유 방법은
Class A {
private int a ;
private int b ;
public int getA(Object obj) throws userDefinedIllegalAccessException {
//check if obj isInstance of B
// If yes return a
// else throw userDefinedIllegalAccessException
}
public int getB(Object obj) throws userDefinedIllegalAccessException {
//check if obj isInstance of c
// If yes return b
// else throw userDefinedIllegalAccessException
}
}
class B {
public void checkAccessValue() {
try{
A objA = new A() ;
System.out.println(objA.getA(this) ;
System.out.println(objA.getB(this) ;
}
catch(userDefinedIllegalAccessException udException){
}
}
}
class C {
public void checkAccessValue() {
try{
A objA = new A() ;
System.out.println(objA.getA(this) ;
System.out.println(objA.getB(this) ;
}
catch(userDefinedIllegalAccessException udException){
}
}
}
1) 당사 2) 어떤 언어로 것입니까? –
당신은 결코 들어 본 적이 없습니다. –
@BookOfZeus : * 액세스 지정자 *를 사용하여 차동 * 액세스를 어떻게 달성합니까? 나는 좋은 디자인에 그런 계층 구조가 필요 없다고 생각하지만 당신의 응답 이후로 나는 액세스 지정자를 사용하여 이것을 어떻게 달성 할 수 있을지 궁금하다. –