是否可以隐藏或阻止继承的protected virtual
或protected abstract
方法,以便进一步继承类无法访问它们?
例如:
class Base<T>
{
protected abstract T CreateInstance();
}
class Derivative : Base<Derivative>
{
protected sealed override Derivative CreateInstance()
{
return new Derivative();
}
}
class MoreDerivative : Derivative
{
public MoreDerivative()
{
// cannot access CreateInstance here
}
}
我不认为它是用语言实现的,但也许有注释或类似的东西。
答案 0 :(得分:4)
没有。当您为某个类型定义成员时,您会说该类型及其所有子类型都将具有该成员。没有办法“撤销”那个。这个假设是类型系统不可或缺的一部分。
您可能希望在此处考虑使用合成,而不是继承。创建一个类型为Derivative
的字段,而不是从中继承。
答案 1 :(得分:1)
您可以根据您打算使用代表的精神来完成某些事情:
class Base<T>
{
private readonly Func<T> _createInstance;
public Base(Func<T> createInstance)
{
_createInstance = createInstance;
}
private T CreateInstance()
{
return _createInstance();
}
}
class Derivative : Base<Derivative>
{
public Derivative() : base(CreateInstance)
{
}
private static Derivative CreateInstance()
{
return new Derivative();
}
}
class MoreDerivative : Derivative
{
public MoreDerivative()
{
// cannot access CreateInstance here
}
}
非静态实施:
class Base<T>
{
private readonly Func<Base<T>, T> _createInstance;
public Base(Func<Base<T>, T> createInstance)
{
_createInstance = createInstance;
}
private T CreateInstance()
{
return _createInstance(this);
}
}
class Derivative : Base<Derivative>
{
public Derivative() : base(CreateInstance)
{
}
private static Derivative CreateInstance(Base<Derivative> caller)
{
return ((Derivative)caller).CreateInstance();
}
private Derivative CreateInstance()
{
return new Derivative();
}
}
class MoreDerivative : Derivative
{
public MoreDerivative()
{
// cannot access CreateInstance here
}
}
答案 2 :(得分:1)
对于其他在此处结束的人,您也可以创建一个内部虚方法,只要您想要查看该方法的唯一类在同一个程序集中。
答案 3 :(得分:0)
不,这是不可能的。为了坚持您的示例,MoreDerivative
仍然是Base<Derivative>
的子类型,Base<>
包含CreateInstance
方法。所以你必须才能访问该方法。如果你没有,你可以将对象转换为基类型然后访问它。
答案 4 :(得分:0)
在Obsolete
中尝试调用方法时,向Derivative.CreateInstance
添加MoreDerivative
注释会导致编译器警告。如果调用与声明不在同一解决方案中,则EditorBrowsable
会隐藏IntelliSense中的方法。
[System.ComponentModel.EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete("Method must only be invoked by the base class.", true)]
protected sealed override Derivative CreateInstance() { /*...*/ }