c# 受保护的基类,只用于继承。

问题描述 投票:0回答:1

在继承的问题上,我有点挣扎。我有两个派生类要使用的共同属性,所以我做了一个基类。LogBaseViewModel. 我不希望这个基类除了被派生类继承之外,还能被使用,所以我把它做成了protected(也试过private)。

我发现了这一点,也许我理解错了,但我想如果我把这三个类都包在一个类里,它们就不再是 "外部 "的了,因此这将是允许的。

从C# 5规范的3.5.3节。

当一个受保护的实例成员被访问到它被声明的类的程序文本之外时, 当一个受保护的内部实例成员被访问到它被声明的程序文本之外时, 访问必须发生在一个从它被声明的类派生的类声明中. 此外,访问必须通过该派生类类型的实例或由其构造的类类型进行。

然而,没有喜悦,我得到了错误。Error CS0060 Inconsistent accessibility: base class 'LogViewModels.LogBaseViewModel' is less accessible than class 'LogViewModels.LogSearchViewModel'.

public class LogViewModels
{
    protected class LogBaseViewModel
    {
        public int Id { get; set; }
        public string Level { get; set; }
        public string Message { get; set; }
        public string Exception { get; set; }
    }

    public class LogSearchViewModel : LogBaseViewModel
    {

        public DateTime? FromDate { get; set; }
        public DateTime? ToDate { get; set; }
    }

    public class LogViewModel : LogBaseViewModel
    {
        public System.DateTime Date { get; set; }
    }
}
c# inheritance c#-7.0
1个回答
3
投票

应用 protected 上的修饰语 LogBaseViewModel 将使其只能在内部访问 LogViewModels以及在 的子类 LogViewModels的子类,而不是 LogBaseViewModel.

此处:

受保护成员在其类内和派生类实例中均可访问。

受保护成员 "是指 阶层 LogBaseViewModel. "其类 "指的是包围类。LogViewModels.

通过使 LogBaseViewModel 保护,你是在告诉编译器,你不想让任何外部类知道你的 LogBaseViewModel. 但你又说 public class LogSearchViewModel : LogBaseViewModel. 这使得人们可以进入内部的 LogBaseViewModel 通过 LogSearchViewModel! 编译器认为这将使 protected 上的修饰语 LogBaseViewModel 无意义,所以给你一个错误。

你说

我不希望这个基类除了被派生类继承之外,还被使用。

哪个是基类的用例?abstract 阶层. 你应该保持 LogBaseViewModel 公开,并使之 abstract.

© www.soinside.com 2019 - 2024. All rights reserved.