문제

안녕하세요 저는 추상적 인 방법으로 "A"수업이 있습니다.

protected abstract List<Contributor> GetContributors(List<SyndicationPerson> contributersList);

다음 조건으로 파생 클래스 "B"에서이 방법을 무시하고 싶습니다.

  • B 클래스에 개인이어야합니다.

컴파일러는이 방법을 파생 클래스 "B"에서 비공개로 선언 할 수 없습니다. 올바른 구문은 무엇입니까?

도움이 되었습니까?

해결책

당신은 할 수 없습니다. 그것은 A 클래스 A에서 선언 된 접근성 수준을 위반할 것입니다. 다른 것 외에는 클래스 A에 의해 호출 될 수없는 것을 막을 것입니다! 클래스 A의 코드가 개인 구현으로 어떻게 든 재정의하는 추상 방법을 호출하려고 시도하면 어떻게 될까요?

메인 구현을 비공개로 만들고 실제로 원하는 경우 개인을 개인화하는 보호 된 방법을 만들 수 있습니다.

A에서 호출 할 수 있도록 설계되었을 때 왜 메소드를 비공개로 만들고 싶습니까?

편집 : 좋아, 이제 당신은 당신의 의견에 당신이 무엇을하고 싶은지 설명했다. 가장 가까운 것은 대의원을 A의 생성자에게 전달하는 것입니다. 대의원은 개인 방법을 참조 할 수 있습니다. 불행히도, 당신은 생성자 체인에 인수를 전달할 때 "이것"을 사용할 수 없으므로, 당신은 공전 "이것"을 첫 번째 매개 변수로 사용하는 메소드는 효과적으로 ... 부모가 어떤 유형인지 선언 할 수 없으므로 올바른 유형에 시전해야한다는 점을 제외하고는 효과적으로 ... 그런 다음 부모는 보호 된 방법 대신 대의원을 호출합니다.

이것은 또한 더 파생 된 클래스가 "재정의"를 더 이상 방해하지 않으며, 이는 바람직하거나 바람직하지 않을 수 있습니다.

그것은 엄청나게 구불 구불 한 것입니다. 그리고 나는 가능한 한 그것을 피하려고 노력할 것입니다. 파생 수업이 무엇을할지에 대해 정말로 걱정된다면, 나는 대신 수업을 봉인하고 사람들이 상속 대신 구성을 사용하도록 강요하려고 노력합니다. 언어는 실제로 여기서 원하는 것을하는 데 도움이되지 않습니다.

다른 팁

일반적인 oops 규칙으로서, 재정의 할 때 회원의 가시성을 줄일 수는 없습니다. 따라서 보호에서 개인으로가는 것은 허용되지 않습니다.

C#에서 가상 메소드의 액세스 수준을 변경할 수 없습니다. 당신은 그것을 사용하여 그것을 다시 사용할 수 있습니다 new 키워드이지만 이것은 이전 메소드를 숨기는 재분배이므로 선언 된 실제 유형과 실제 유형이 다른 개체를 다루거나 기본 클래스 유형으로 일상적으로 캐스팅하는 경우 예상대로 작동하지 않습니다.

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