명시 적 인터페이스 구현에서 동일한 이름의 암시 적 특성을 참조 할 수 있습니까?
-
19-08-2019 - |
문제
문자열 유형의 속성을 구현하는 유형이 있다고 가정합니다.
public class Record
{
public string Value { get; set; }
}
그런 다음 동일한 이름의 속성을 정의하는 인터페이스가 있습니다.
public interface IIntValued
{
public int Value { get; set; }
}
다음과 같이 명시 적 인터페이스를 사용할 수 있습니다.
public class Record : IIntValued
{
public string Value { get; set; }
int IIntValued.Value
{
get{ return 0; } set{}
}
}
그러나 명시 적 인터페이스에서 문자열 "값"을 참조하려면 할 수 있습니까? 그렇다면 어떻게? 나는 그것이 다음과 같다고 생각합니다.
public class Record : IIntValued
{
public string Value { get; set; }
public int IIntValued.Value
{
get
{
string value = /*Magic here*/.Value;
return int.parse(value);
}
set{}
}
}
보시다시피, 나는 "int valued" "value"속성의 표현식에 대한 "문자열 가치" "값"속성을 원합니다. 명시 적으로 구현 된 인터페이스 멤버 인 경우 해당 인터페이스를 타이핑 한 다음 사용할 수 있지만 암시 적 유형 멤버의 경우 어떻게 작동합니까?
참고 :이 예제는 약간 고안되었지만 언어 질문을 보여줍니다.
해결책
암시 적 유형 멤버의 경우, 그냥 Value
또는 this.Value
괜찮을 것입니다 - 해결되지 않기 때문입니다 IIntValued.Value
기본적으로.
다른 팁
물론 넌 할 수있어! 문제는 접근성 키워드가 불법 인 곳에 배치했다는 것입니다. 명시 적으로 구현 된 회원에게는 접근성 키워드가 없을 수 있습니다. 암시 적으로 구현 된 것은 iintvalue와 함께 쓰여질 것입니다. 멤버 이름에 접두사.
다음은 작동하는 샘플입니다.
public interface IIntValued
{
int Value { get; set; }
}
public class Record : IIntValued
{
public string Value { get; set; }
int IIntValued.Value
{
get
{
string value = this.Value;
return int.Parse(value);
}
set { }
}
}
예, 두 속성 모두에 액세스 할 수 있습니다. 속성에 액세스하는 데 사용되는 변수의 유형에 따라 다릅니다. 관찰하다:
Record myInstanceAsRecord = myInstance;
IIntValued myInstanceAsIIntValued = myinstance;
string valueAsString = myInstanceAsRecord.Value;
int valueAsInt = myInstanceAsIIntValued.Value;
어, 요약을 작성한 후, 나는 그 대답을 알고 있다는 것을 깨달았습니다. : p 내가 가져 가면 this
그리고 클래스 유형으로이를 캐스트하면 언급 된 구현이 포함되지 않습니다.
string value = ((Record)this).Value; //is the implicit string.
편집하다: 추가 입력 후 (감사합니다. 응답자!) 후에 컴파일러가 자동으로 수행하는 일을 수동으로 수행 할 필요가 없다는 것이 지적되었습니다. 따라서:
string value = this.Value;
일했을 것입니다. 물론 이것은이기 때문입니다 this
인터페이스 변수가 아니므로 암시 적 특성은 기본적으로 선택된 속성이됩니다.