2017-12-09 22 views
3

C# (모든 버전)은 속성 이름의 별칭을 향상시키는 방법을 제공합니까? AccountBase에서 사용자 이름 문자열을 사용하여 계정을 식별하지만 NonstandardAccount에서 클라이언트 (고객)가 혼동을 방지하기 위해 CustomerNumber를 사용하도록합니다.C#에서는 속성 이름의 별칭을 지정할 수 있습니까?

여기 내 코드입니다 : 나는 CUSTOMERNUMBER 속성을 추가 포기하고 그냥 사용자 이름과 동일 함을 문서화 할 수

public abstract class AccountBase 
{ 
    public string Username { get => Username; set => Username = value; } 
} 

public class StandardAccount 
{ 
    // The username is the ID 
} 


public class NonstandardAccount : AccountBase 
{ 
    // The Username or CustomerNumber is the ID 
    public string CustomerNumber { get => Username; set => Username = value; } 

    // OR ideally, but I don't think this works 
    public string CustomerNumber => Username; 
} 

, 그러나 그것은 분명하지 않다. 나는 그대로 구현을 떠날 수 있지만 명확성을 위해 여분의 스토리지가 좋은 절충안이 아닐 수도 있습니다.

+0

'AccountBase'에 대해 개인 backerfield를 제공하지 않으면'{get; set;}'을 사용하십시오. 'StandardAccount'는 아마 당신의 설명에 따라'AccountBase'를 상속 받아야 할 것입니다. 'NonstandardAccount' 모델이 있다면'{get => Username; set => Username = value;}'하지만 세터에 부작용이있는 것은 내가 생각하기에 눈살을 찌푸리게합니다. MVC 및 WPF의 경우 특성을 사용하여 afaik의 디스플레이 (DisplayNameAttribute)에 대한 viewmodel-fields의 "rename"을 수행 할 수 있습니다. –

+0

현재의 구현체는 여전히'NonstandardAccount'에'AccountBase'의'UserName' 속성을 노출합니다. – Odrai

+0

@Odrai가 새로 숨기는 것은 Liskov를 위반할 것입니다. 그래서 나는 그렇게하지 않을 것입니다 ... –

답변

3

패트릭 아트너 덕분에 나는 대답뿐만 아니라 이상적인 대답을 발견했습니다. 그것은 내 소스 코드에서 모든 것이 맞았지만 내 직감을 믿지 않았습니다.

public class NonstandardAccount : AccountBase 
{ 
    // Does work and works perfectly! Username is still accessible 
    public string CustomerNumber => Username; 
} 

새로운 하드 배운 교훈 : 당신의 직관이 많은 경우에 잘못해서, 당신은 병적 인 거짓말 쟁이로 신용을해야 의미하지 않는다.