원시 데이터 세트가 포함 된 클래스 A와 해당 데이터의 재구성 된 버전 (GUI 준비 됨)을 포함하는 클래스 B가 A의 원시 데이터를 표시 할 수있게하려는 경우 B.C# 친구 클래스 및 OOP 구성
분명히 클래스 A의 원시 데이터는 개인 회원에 포함됩니다. 나는 그 데이터를 B에서 볼 수 있도록하고 싶지만 C++ friend 클래스 메소드와 비슷한 것을 사용한다.
어떻게 접근 할 수 있습니까?
감사합니다.
원시 데이터 세트가 포함 된 클래스 A와 해당 데이터의 재구성 된 버전 (GUI 준비 됨)을 포함하는 클래스 B가 A의 원시 데이터를 표시 할 수있게하려는 경우 B.C# 친구 클래스 및 OOP 구성
분명히 클래스 A의 원시 데이터는 개인 회원에 포함됩니다. 나는 그 데이터를 B에서 볼 수 있도록하고 싶지만 C++ friend 클래스 메소드와 비슷한 것을 사용한다.
어떻게 접근 할 수 있습니까?
감사합니다.
엄밀히 말하면 데이터를 노출 할 수있는 특정 클래스 (또는 클래스 목록)를 정의 할 수 없습니다. 그러나 private
대신 internal
액세스 한정자를 사용하면 동일한 어셈블리의 모든 클래스에서 멤버를 사용할 수 있습니다.
강력하게은 노출이 계획중인 것으로 보이는 필드가 아닌 속성을 통해 이러한 멤버를 노출하는 것이 좋습니다. 이렇게하면 클래스가 다른 클래스에 정보를 노출하는 방법과 다른 클래스가 데이터를 변경할 때 발생할 수있는 정보를 정확하게 정의 할 수 있습니다.
어셈블리에서 둘 다 정의하고 A의 필드를 "내부"로 표시 할 수 있습니다.
OO 접근법은 일반적으로 간단한 속성을 통해 데이터 (또는 데이터의 하위 집합)에 대한 액세스를 허용하는 A의 공용 메서드 집합을 제공하는 것입니다.
구조에 따라 부분 클래스를 사용할 수 있습니다. 이는 데이터와 UI가 실제로 같은 클래스 내에 있지만 둘 다 다른 파일에 있음을 의미합니다.
그게 효과가 없다면 UI가보다 일반적인 방식으로 나타내는 데이터 세트로 대체하거나 작업 할 수있는 내부 범위 변수가 있습니다. 이러한 값은 액세스가 될 수 있도록
이전 방법 (웃기 의도) 간단한 getvalue을 정의하는 것이다() 및 setValue의()는 기능이 C#으로, 이러한 기능을 사용하지 않고, 그 값을 반환 이러한 함수 속성이라고하는 미리 정의 된 멤버입니다. 다른 사람들이 단지 internal
수정을 사용, 내 앞에 언급 한 것처럼
class TestMethod{
private int Secret;
get { return Secret;}
set { Secret = value;}
}
다른 방법은,이다.
는
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));
}
}
이것은 'friend'의 의미를 구현하는 영리한 방법입니다.나는 항상 '친구'를 사용하지 않지만, 할 때 나는이 접근 자 패턴을 사용한다 :-) –
하지만 이것은 컴파일 타임의 안전을 깨뜨린다. 나는 여기서 꽤 많은 클래스를'AccessData'에 쓸 수 있었고 컴파일러는 불평하지 않았습니다. –
'internal' + 속성 = 안전 ..이 당신을 도움이 될 수 있음. –
이것은 B가 지나치게 A에 묶이지 않고 일부 비공개 멤버에 액세스 할 수있게하는 소스 데이터 클래스 A가 구현하는 * 내부 속성 * 또는 가능한 내부 인터페이스 *의 경우와 비슷합니다. – LBushkin
@LBushkin : 내부 인터페이스 확실히 해결책이지만 실제로 구현하는 클래스가 두 개 이상 있지 않으면 불필요한 것처럼 보입니다. –