在继承的问题上,我有点挣扎。我有两个派生类要使用的共同属性,所以我做了一个基类。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; }
}
}
应用 protected
上的修饰语 LogBaseViewModel
将使其只能在内部访问 LogViewModels
以及在 的子类 LogViewModels
的子类,而不是 LogBaseViewModel
.
从 此处:
受保护成员在其类内和派生类实例中均可访问。
受保护成员 "是指 阶层 LogBaseViewModel
. "其类 "指的是包围类。LogViewModels
.
通过使 LogBaseViewModel
保护,你是在告诉编译器,你不想让任何外部类知道你的 LogBaseViewModel
. 但你又说 public class LogSearchViewModel : LogBaseViewModel
. 这使得人们可以进入内部的 LogBaseViewModel
通过 LogSearchViewModel
! 编译器认为这将使 protected
上的修饰语 LogBaseViewModel
无意义,所以给你一个错误。
你说
我不希望这个基类除了被派生类继承之外,还被使用。
哪个是基类的用例?abstract
阶层. 你应该保持 LogBaseViewModel
公开,并使之 abstract
.