2009-03-08 3 views
16

해당 인터페이스의 속성에 설정된 접근자를 제공하여 인터페이스를 '확장'하려고합니다. 인터페이스는 다음과 같은 : C#에서 인터페이스의 속성에 'set'을 추가하십시오.

interface IMutableUser : IUser 
{ 
    string UserName 
    { 
     get; 
     set; 
    } 
} 

내가 상속이 필요합니다

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

나는 이런 식으로 뭔가를 할 수 있습니다. IUser의 본문을 IMutableUser에 복사 할 수없고 설정된 접근자를 추가 할 수 없습니다.

C#에서 가능합니까? 그렇다면 어떻게 성취 될 수 있습니까?

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

abstract class MutableUser : IUser 
{ 
    public virtual string UserName 
    { 
     get; 
     set; 
    } 
} 

또 다른 가능성이있을 것입니다 :

답변

12

나는 당신이 일을하지 말아야 게시 한 내용을 어떤 이유가 표시되지 않는 이유는 무엇입니까? 그냥 빨리 테스트 해봤는데 제대로 컴파일되었지만 숨어있는 것에 대한 경고를줍니다. 다음과 같이 new 키워드를 추가하면이 문제를 해결할 수 있습니다.

public interface IMutableUser : IUser 
{ 
    new string Username { get; set; } 
} 

다른 대안은 명시 적 세트 메소드를 추가하는 것입니다. 예 :

public interface IMutableUser : IUser 
{ 
    void SetUsername(string value); 
} 

물론 나는 setter를 사용하는 것을 선호하지만 가능하지 않은 경우에는 수행해야 할 작업을 수행합니다.

+0

새로운 기능이 추가되었습니다. 감사! 예를 들어 답을 업데이트 할 수 있습니까? – strager

+0

실제적인 관점에서 볼 때, 인터페이스는 시간이 지남에 따라 매우 악화됩니다. 인터페이스의 모든 구현자는이 계약에 대한 모든 변경 사항을 깨뜨릴 것입니다. –

+0

@PatrickPeters - 주석이 SetUserName 메소드로 전달되었다고 가정합니다. 첫 번째 옵션에는 문제가 표시되지 않습니다. 구현자가 적절한 곳에 명시 적 구현을하면 가능한 휴식 시간 중 일부가 제거됩니다. – Maslow

8

당신은 추상 클래스를 사용할 수

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

interface IMutableUser 
{ 
    string UserName 
    { 
     get; 
     set; 
    } 
} 

class User : IUser, IMutableUser 
{ 
    public string UserName { get; set; } 
} 
+0

IUser를 상속하려면 MutableUser가 필요합니다. 나는 첫 번째 방법을 살펴볼 것이다. – strager

+0

추상 클래스를 사용하면 효과가 있습니다. 그러나, 그것은 여기에서 가장 우아한 해결책이 아닌 것 같습니다. 가능한 "더 나은"대답을 위해이 질문을 잠시 열어 두십시오. – strager

7

명시 적으로 인터페이스를 구현하여 인터페이스의 속성을 "재정의"할 수 있습니다. Chris의 대답은 당신이 설명한 시나리오에 필요한 것 일지 모르지만 클래스에 getter/setter가 필요한 좀 더 복잡한 시나리오를 고려해보십시오.하지만 인터페이스는 getter 만 정의합니다. 다음을 수행하여이 문제를 얻을 수 있습니다 : 명시 적으로 IUser.MyProperty를 구현함으로써

public class MyUser : IUser 
{ 

    IUser.MyProperty { get { return "something"; } } 

    public MyProperty { get; set; } 

} 

, 당신은 계약을 만족시킨다. 그러나 공개 MyProperty을 제공하면 개체 용 API가 명시 적 인터페이스 버전을 표시하지 않으며 항상 MyProperty를 get/set과 함께 사용합니다.

관련 문제