2011-09-24 42 views
7

我试图继承接口,并将一些自动生成的set属性设置为私有。这是一个例子。在C#中使用辅助功能修饰符继承属性

public class MyClass 
{ 
    public interface A 
    { 
     int X {get; set;} 
    } 
    public interface B : A 
    { 
     int Y {get; set;} 
    } 

    public class C : A 
    { 
     public int X {get; private set;} 
    } 

当我试图编译它。我收到了一个错误'MyClass.C' does not implement interface member 'MyClass.A.X.set'. 'MyClass.C.X.set' is not public.

我尝试private set;iterface A,但我再次得到这个错误:'MyClass.A.X.set': accessibility modifiers may not be used on accessors in an interface

C#中不允许使用此辅助功能修饰符吗?

回答

21

我试着用私人设置;在iterface A,但我得到这个错误再次

如果你的接口只需要一个属性应该是检索,将其定义为:

public interface A 
{ 
    int X {get;} // Leave off set entirely 
} 
1

接口的声明定义了实现类型必须拥有的公共成员集。因此,如果C实现了A,则它必须具有由接口定义的每个成员的公共成员。

A定义任何实施类型必须具有公共获取者和公共设置者的公共属性XC不符合此要求。

+0

公众会员不是唯一的选择。显式接口实现是另一种。 – svick

0

你可以把一个接口作为最小功能你的班级必须执行。如果接口指定属性公开getset子句,则必须在您的类中实现公开getset子句,因为只有公共方法和属性才可以隐式实现接口。

如果您不想公开突变体,您可以在接口属性定义中简单地省略set关键字。然后你可以使实现mutator为public或private。

0

不,这是不允许的。请记住,这是使用的class C一个实例必须可以把它当作一个interface A,这意味着该合同是一个公共的getter和setter财产X.

这适用于类继承和接口代码继承 - 您必须遵守您所得到的类型的合约。

如果代码的意图是财产X不应该有一个公共的二传手,那么接口应该只用{ get; }

0

定义我相信接口的成员必须是公开的,如果接口本身是公开的。您的财产实施是有缺陷的,因为这一点。

+1

隐式实现接口成员的成员必须是public *,而不管接口本身的可访问性域。 –