존재하지 않는 일련의 메소드를 오버라이드 (override)하려고되지만, 단어 "재정의" 선언에서 컴파일러는 기본 클래스에서 동일한 서명을 가진 메소드를 찾습니다. 그 방법을 찾을 수 없으므로 세트를 만들 수 없습니다.
ArsenMkrt에 따르면 기본 선언에 보호 집합을 포함하도록 변경할 수 있다고합니다. 이렇게하면 재정의 할 수 있지만 여전히 서명을 변경할 수 없으므로 하위 클래스의이 메소드를 public으로 승격 할 수 없으므로 게시 한 코드는 작동하지 않습니다.
아무 것도하지 않는 기본 클래스에 공용 가상 세트 메소드를 추가해야합니다 (또는 호출하려고 시도해도 예외가 발생 함).하지만 클래스의 사용자가 기대하는 것과 상반됩니다
///<summary>
///Get the Text value of the object
///NOTE: Setting the value is not supported by this class but may be supported by child classes
///</summary>
public virtual string Text
{
get { return text; }
set { }
}
//using the class
BaseClass.Text = "Wibble";
if (BaseClass.Text == "Wibble")
{
//Won't get here (unless the default value is "Wibble")
}
그렇지 않으면 별도의 방법으로 세트를 선언 :이 작업을 수행 할 경우 동작은 (그리고 나는 그것을 권장하지 않습니다)가 너무 잘 사용자가 그것을 놓칠 수없는 문서화되어 있는지 확인 그럴하기 귀하의 자녀 수업 :
public override string Text
{
get { return differentText; }
}
public void SetText(string value)
{
differentText = value;
}
나는 동일 할 싶습니다. 가능해야합니다. –
가능하지만 "중산층"이 필요합니다. 또한 여러 상황에서 좋은 아이디어는 아니지만, 예를 들어 추상 속성을 무시할 때와 같은 몇 가지 예외가 있습니다. Base :'public abstract string Text {get; }'. 중간 (상속) :'protected internal string text;''public sealed override string Text {get {return text; }}'. 하위 (상속 중간) :'public new string Text {get {return text; } set {text = value; }}'. 보호 된 내부 수정 자 및 봉합 된 덮어 쓰기는 캡슐화가 어셈블리 외부에서 손상되지 않도록합니다. – AnorZaken
@AnorZaken : 그것은 무시하지 않습니다. 그것은 그림자입니다. 중급 클래스도 필요하지 않습니다. – Guffa