방법/속성을 한 클래스에 보이고 다른 클래스에 숨겨져 있습니다.

StackOverflow https://stackoverflow.com/questions/550268

  •  23-08-2019
  •  | 
  •  

문제

수업이 있습니다 Server IRC의 서버 연결과 대화합니다. 알려진 목록을 보유하고 있습니다 Users, 필요에 따라 그것들을 만듭니다.

나는 두 가지 문제가 있습니다 User 수업:

  1. 누구나 인스턴스를 만들 수 있습니다 User. 나는 단지 만 원한다 Server 이것을 할 수있는 수업.
  2. 사용자 (사물) User 설명) 자신의 이름 (또는 가입 채널과 같은 다른 정보)을 변경합니다. Server 수업은 자체적으로 변경할 수 있습니다. 그러나 다른 수업도 할 수 있습니다! 다른 수업 이이 정보를 건드리지 않도록하지 않기를 바랍니다 (읽기 전용).

이 두 가지 문제를 어떻게 해결할 수 있습니까? C ++에서는 사용하여 해결할 수 있습니다. friend 키워드 및 CTOR 제작 및 setName (그리고 그러한) 개인.

지정된 클래스에서 특정 메소드에 액세스 할 수있는 C# 키워드가 있습니까? 이것은 내 문제를 해결할 것입니다.

도움이 되었습니까?

해결책

솔직히 나는 그것을 발견한다 friend 나쁜 디자인의 증상으로 C ++에서 유래 한 액세스. 당신은 당신의 디자인을 고치는 것이 좋습니다.

처음에는 누군가가 사용자를 창조하면 누가 정말 신경 쓰나요? 정말로 중요합니까? 나는 때때로 우리 프로그래머들이 단순히 일어나지 않는 일에 대해 걱정하는 것처럼 보이기 때문에 이것을 묻습니다.

당신이 정말로 돌보는 경우 다음 중 하나를 수행하십시오.

  • 사용자를 인터페이스로 만드십시오. 서버는 그것을 구현하는 개인 클래스를 인스턴스화 할 수 있습니다. 또는
  • 공개 생성자가없는 내부 클래스의 서버로서 서버 만 인스턴스화 할 수 있습니다.

가시성 해킹 (C ++의 친구 중 하나는 하나이고 Java의 패키지 액세스는 모두 좋은 예입니다)은 단순히 문제를 요구하고 좋은 생각은 아닙니다.

다른 팁

.NET 세계에서 가장 가까운 곳 friend 입니다 internal 시계.

두 클래스가 별도의 어셈블리 인 경우 InternalSvisibleto 다른 내부의 내부의 어셈블리 가시성을 허용하는 속성.

클래스 계층 구조를 재 설계하는 것은 아마도이 문제에 대한 공정한 솔루션 일 것입니다. 당신이 정말로 필요한 것이 저에게 필요한 것은 서버 클래스 외부에 존재할 때 읽기 전용 사용자 클래스입니다.

나는 아마도 다음과 같은 일을 할 것입니다.

// An abstract base class. This is what I'd use outside the 
// Server class. It's abstract, so it can't be instantiated
// on its own, and it only has getters for the properties. 
public abstract class User
{
   protected User()
   {
   }

   public string Name { get;}
   // Other get-only properties
}

public class ServerUser : User
{
   public ServerUser()
   {
   }

   public string Name { get; set;}
   // Other properties. 
}

그런 다음 서버 클래스가 ServerUser 클래스를 생성하고 사용자 이름 변경과 같은 ServerUser 클래스에서 속성을 변경하여 사용자 클래스를 외부 세계에만 노출시킵니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top