在c#中继承带有可访问性修饰符的属性

本文关键字:属性 访问 继承 | 更新日期: 2023-09-27 18:09:28

我尝试继承接口,并使一些自动生成的set属性为私有。这是一个例子。

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.

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

这个可访问性修饰符在c#中不允许吗?

在c#中继承带有可访问性修饰符的属性

I try with private set;在接口A中,但是我又得到了这个错误

如果你的接口只要求一个属性应该是可检索的,你定义它为:

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

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

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

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

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

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

这既适用于类继承,也适用于接口继承——你必须遵循你的派生类型的契约。

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

来定义。

如果接口本身是公共的,那么接口成员必须是公共的。