인터페이스를 사용할 때 프라이빗 세터를 어떻게 구현합니까?


139

몇 가지 속성을 가진 인터페이스를 만들었습니다.

인터페이스가 존재하지 않으면 클래스 객체의 모든 속성이

{ get; private set; }

그러나 이것은 인터페이스를 사용할 때 허용되지 않으므로 어떻게 할 수 있습니까?

답변:


266

인터페이스에서는 getter속성에 대해서만 정의 할 수 있습니다

interface IFoo
{
    string Name { get; }
}

그러나 수업 시간에 private setter-

class Foo : IFoo
{
    public string Name
    {
        get;
        private set;
    }
}

1
인터페이스에 게터 만 포함되어 있어도 세터가 공개되어 있으면 불평하지 않는 것 같습니다.
Mike Cheel

6
@MikeCheel 인터페이스가 최소 메서드 / 접근 자만 정의하기 때문입니다. 객체를 직접 사용할 때 더 자유롭게 추가 할 수 있습니다. 인터페이스 유형으로 객체를 사용할 때 인터페이스에 정의 된 메소드 / 접근 자만 사용할 수 있습니다.
Marcello Nicoletti

29

인터페이스는 공개 API를 정의합니다. 공개 API에 게터 만 포함 된 경우 인터페이스에서 게터 만 정의합니다.

public interface IBar
{
    int Foo { get; }    
}

개인 세터는 다른 개인 구성원과 마찬가지로 공용 API의 일부가 아니므로 인터페이스에서 정의 할 수 없습니다. 그러나 인터페이스 구현에 (비공개) 멤버를 자유롭게 추가 할 수 있습니다. 실제로 setter가 퍼블릭 또는 프라이빗으로 구현되는지 또는 setter가 있는지 여부는 중요하지 않습니다.

 public int Foo { get; set; } // public

 public int Foo { get; private set; } // private

 public int Foo 
 {
    get { return _foo; } // no setter
 }

 public void Poop(); // this member also not part of interface

Setter는 인터페이스의 일부가 아니므로 인터페이스를 통해 호출 할 수 없습니다.

 IBar bar = new Bar();
 bar.Foo = 42; // will not work thus setter is not defined in interface
 bar.Poop(); // will not work thus Poop is not defined in interface
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.