我尝试继承接口,并将一些自动生成的set属性设为private。这是一个例子。
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#中不允许使用此辅助功能修饰符吗?
答案 0 :(得分:24)
我试过私人套装;在iterface A中,但我又遇到了这个错误
如果您的界面仅要求可检索属性,则将其定义为:
public interface A
{
int X {get;} // Leave off set entirely
}
答案 1 :(得分:1)
接口声明定义了实现类型必须具有的公共成员集。因此,如果C
实现A
,则它必须为接口定义的每个成员都有一个公共成员。
A
定义任何实现类型必须具有带有公共getter和public setter的公共属性X
。 C
不符合此要求。
答案 2 :(得分:0)
您可以将接口视为您的类必须实现的最低功能。如果接口指定属性公开get
和set
子句,那么您必须在类中实现公共get
和set
子句,因为只有公共方法和属性可以隐式实现接口。
如果您不想公开公共mutator,可以简单地在接口属性定义中省略set
关键字。然后,您可以将实现mutator设为公共或私有。
答案 3 :(得分:0)
不,不允许。请记住,使用class C
实例的代码必须能够将其视为interface A
,这意味着合同是属性X的公共getter和setter。
这适用于类继承以及接口继承 - 您必须遵循派生类型的契约。
如果代码的意图是属性X不应该有公共setter,那么接口应该只用{ get; }
答案 4 :(得分:0)
如果界面本身是公共的,我相信界面成员必须是公共的。因此,您对该属性的实现是错误的。