向接口添加属性是否会阻止在派生类型中创建私有/受保护的"set"?

Cat*_*kul 19 c# inheritance properties interface

编辑: 事实证明我错过了一些明显的东西,但是我会打开这个问题以防万一其他人犯了同样明显的错误.感谢那些指出来的人 见底部的解释.

是否可以在覆盖接口属性的属性上设置非公共集?

也许我有一个愚蠢的时刻,但在我看来,在界面中定义一个属性隐含地要求没有派生类可以为所述属性提供任何非公共集.

例:

interface IField
{
    bool IsValid { get; }
}
Run Code Online (Sandbox Code Playgroud)

...并且由于界面属性可能没有辅助功能修饰符意味着:

class Field : IField
{
    public override bool IsValid { get; protected set; }
}
Run Code Online (Sandbox Code Playgroud)

......尽管它在概念上符合接口要求,但是不可能实现.

IMO对于可能通过非公共属性进行的封装具有很大的负面影响,并且阻止了许多常见的使用模式.

我知道你可以创建一个非公共的SetIsValid成员来修改一个公共的后备存储,但这会产生一个不一致的模式,并添加原本不需要的代码噪声.

我错过了什么吗?


编辑:是的,我已经错过了什么

我正在修改别人的代码,只是意识到我正在挣扎的类实现了接口并从基类派生.我是c#的新手,这就是导致覆盖混乱的原因.

实际的班级看起来像:

class Field : IField, BaseField
{
    public override bool IsValid { get; protected set; }
}
Run Code Online (Sandbox Code Playgroud)

...其中BaseField也实现了接口,但没有实现该集合.

BFr*_*ree 35

这是完全合法的.你不需要override关键字(实际上它不会编译)但是没有什么能阻止你这样做:

interface IField
{
    bool IsValid { get; }
}

class Field : IField
{
    public bool IsValid { get; protected set; }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ann 6

可以在接口上,但不能在抽象/虚拟属性上 - 你可能将这两者混淆了.