2010-02-01 4 views
12

원시 데이터 세트가 포함 된 클래스 A와 해당 데이터의 재구성 된 버전 (GUI 준비 됨)을 포함하는 클래스 B가 A의 원시 데이터를 표시 할 수있게하려는 경우 B.C# 친구 클래스 및 OOP 구성

분명히 클래스 A의 원시 데이터는 개인 회원에 포함됩니다. 나는 그 데이터를 B에서 볼 수 있도록하고 싶지만 C++ friend 클래스 메소드와 비슷한 것을 사용한다.

어떻게 접근 할 수 있습니까?

감사합니다.

답변

10

엄밀히 말하면 데이터를 노출 할 수있는 특정 클래스 (또는 클래스 목록)를 정의 할 수 없습니다. 그러나 private 대신 internal 액세스 한정자를 사용하면 동일한 어셈블리의 모든 클래스에서 멤버를 사용할 수 있습니다.

강력하게은 노출이 계획중인 것으로 보이는 필드가 아닌 속성을 통해 이러한 멤버를 노출하는 것이 좋습니다. 이렇게하면 클래스가 다른 클래스에 정보를 노출하는 방법과 다른 클래스가 데이터를 변경할 때 발생할 수있는 정보를 정확하게 정의 할 수 있습니다.

+1

'internal' + 속성 = 안전 ..이 당신을 도움이 될 수 있음. –

+0

이것은 B가 지나치게 A에 묶이지 않고 일부 비공개 멤버에 액세스 할 수있게하는 소스 데이터 클래스 A가 구현하는 * 내부 속성 * 또는 가능한 내부 인터페이스 *의 경우와 비슷합니다. – LBushkin

+1

@LBushkin : 내부 인터페이스 확실히 해결책이지만 실제로 구현하는 클래스가 두 개 이상 있지 않으면 불필요한 것처럼 보입니다. –

1

어셈블리에서 둘 다 정의하고 A의 필드를 "내부"로 표시 할 수 있습니다.

OO 접근법은 일반적으로 간단한 속성을 통해 데이터 (또는 데이터의 하위 집합)에 대한 액세스를 허용하는 A의 공용 메서드 집합을 제공하는 것입니다.

0

구조에 따라 부분 클래스를 사용할 수 있습니다. 이는 데이터와 UI가 실제로 같은 클래스 내에 있지만 둘 다 다른 파일에 있음을 의미합니다.

그게 효과가 없다면 UI가보다 일반적인 방식으로 나타내는 데이터 세트로 대체하거나 작업 할 수있는 내부 범위 변수가 있습니다. 이러한 값은 액세스가 될 수 있도록

0

이전 방법 (웃기 의도) 간단한 getvalue을 정의하는 것이다()setValue의()는 기능이 C#으로, 이러한 기능을 사용하지 않고, 그 값을 반환 이러한 함수 속성이라고하는 미리 정의 된 멤버입니다. 다른 사람들이 단지 internal 수정을 사용, 내 앞에 언급 한 것처럼

class TestMethod{ 
private int Secret; 

get { return Secret;} 
set { Secret = value;} 
} 

다른 방법은,이다.

7

public class A 
{ 
    public A() { } 

    public string AccessData(object accessor) 
    { 
     if (accessor is B) 
      return "private_data"; 
     else 
      throw new UnauthorizedAccessException(); 
    } 
} 

public class B 
{ 
    public B() { } 

    private void AccessDataFromA() 
    { 
     Console.WriteLine(new A().AccessData(this)); 
    } 
} 
+2

이것은 'friend'의 의미를 구현하는 영리한 방법입니다.나는 항상 '친구'를 사용하지 않지만, 할 때 나는이 접근 자 패턴을 사용한다 :-) –

+1

하지만 이것은 컴파일 타임의 안전을 깨뜨린다. 나는 여기서 꽤 많은 클래스를'AccessData'에 쓸 수 있었고 컴파일러는 불평하지 않았습니다. –