一尘不染

如何在C#中使属性受保护并在内部使用?

c#

这是我缩短的抽象类:

abstract class Report {

    protected internal abstract string[] Headers { get; protected set; }
}

这是派生类:

class OnlineStatusReport : Report {

    static string[] headers = new string[] {
        "Time",
        "Message"
    }

    protected internal override string[] Headers {
        get { return headers; }
        protected set { headers = value; }
    }

    internal OnlineStatusReport() {
        Headers = headers;
    }
}

我的想法是,我希望能够Report.Headers从程序集中的任何地方调用,但只允许由派生类设置它。我尝试Headers只制作内部文件,但受保护并没有比内部文件更严格。有没有一种方法可以将标头设置为内部,并将其设置的访问器保护为AND并内部设置?

我觉得我严重滥用了访问修饰符,因此任何设计帮助都将不胜感激。


阅读 356

收藏
2020-05-19

共1个答案

一尘不染

公开吸气剂有什么问题?如果您将该属性声明为

public string[] Headers { get; protected set; }

它符合您想要的所有条件:程序集的所有成员都可以获取该属性,并且只有派生类可以对其进行设置。当然,程序集外部的类也可以获取该属性。所以?

如果您确实需要在程序集中公开而不是公开显示该属性,则另一种方法是创建一个不同的属性:

protected string[] Headers { get; set; }
internal string[] I_Headers { get { return Headers; } }

当然,用该I_前缀装饰名称很丑陋。但这是一个奇怪的设计。对内部属性进行某种名称修饰是一种提醒自己(或其他开发人员)他们所使用的属性是非正统的方法。另外,如果您以后决定像这样混合使用可访问性并不是解决问题的正确方法,您将知道要修复哪些属性。

2020-05-19