使用接口时如何实现私有设置器?


139

我已经创建了具有某些属性的接口。

如果接口不存在,则将类对象的所有属性设置为

{ get; private set; }

但是,使用接口时不允许这样做,那么可以实现吗?

Answers:


266

在界面中,您只能定义getter您的媒体资源

interface IFoo
{
    string Name { get; }
}

不过,您可以在课堂上将其扩展为private setter-

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

1
即使接口只包含一个getter,setter还是公开的似乎也没有什么问题。
Mike Cheel

6
@MikeCheel那是因为接口仅定义了最少的方法/访问器。直接使用对象时,您可以随意添加更多内容。虽然在将对象用作接口类型时,仅接口中定义的那些方法/访问器才可用。
Marcello Nicoletti

29

接口定义公共API。如果公共API仅包含getter,则可以在接口中仅定义getter:

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

设置器不是接口的一部分,因此无法通过您的接口调用:

 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.