在C#中使用辅助功能修饰符继承属性

时间:2011-09-24 01:58:31

标签: c# inheritance properties

我尝试继承接口,并将一些自动生成的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#中不允许使用此辅助功能修饰符吗?

5 个答案:

答案 0 :(得分:24)

  

我试过私人套装;在iterface A中,但我又遇到了这个错误

如果您的界面仅要求可检索属性,则将其定义为:

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

答案 1 :(得分:1)

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

A定义任何实现类型必须具有带有公共getter和public setter的公共属性XC不符合此要求。

答案 2 :(得分:0)

您可以将接口视为您的类必须实现的最低功能。如果接口指定属性公开getset子句,那么您必须在类中实现公共getset子句,因为只有公共方法和属性可以隐式实现接口。

如果您不想公开公共mutator,可以简单地在接口属性定义中省略set关键字。然后,您可以将实现mutator设为公共或私有。

答案 3 :(得分:0)

不,不允许。请记住,使用class C 实例的代码必须能够将其视为interface A,这意味着合同是属性X的公共getter和setter。

这适用于类继承以及接口继承 - 您必须遵循派生类型的契约。

如果代码的意图是属性X不应该有公共setter,那么接口应该只用{ get; }

定义

答案 4 :(得分:0)

如果界面本身是公共的,我相信界面成员必须是公共的。因此,您对该属性的实现是错误的。