声明接口中的受保护访问成员有什么反对意见?例如,以下代码是无效的:
public interface IOrange
{
public OrangePeel Peel { get; }
protected OrangePips Seeds { get; }
}
在这个例子中,接口IOrange
至少能够保证实现者为其继承者提供一个OrangePips
实例。如果实现者希望的话,他们可以将范围扩展到完全public
。public class NavelOrange : IOrange
{
public OrangePeel Peel { get { return new OrangePeel(); } }
protected OrangePips Seeds { get { return null; } }
}
public class ValenciaOrange : IOrange
{
public OrangePeel Peel { get { return new OrangePeel(); } }
public OrangePips Seeds { get { return new OrangePips(6); } }
}
protected
修饰接口成员的意图是为了为继承者(子类)提供支持合同,例如:
public class SpecialNavelOrange : NavelOrange
{
...
// Having a seed value is useful to me.
OrangePips seeds = this.Seeds;
...
}
(诚然,这对于struct
是不起作用的)
我认为在接口中使用private
或internal
修饰符没有太多意义,但支持public
和protected
修饰符似乎非常合理。
我将尝试通过将interface
与protected
成员分开来解释interface
中protected
成员的实用性:
假设有一个新的C#关键字support
,用于强制继承者遵守合约,我们可以按照以下方式声明:
public support IOrangeSupport
{
OrangePips Seeds { get; }
}
这将使我们能够缩小类,以便为它们的继承者提供受保护的成员:
public class NavelOrange : IOrange, IOrangeSupport
{
public OrangePeel Peel { get { return new OrangePeel(); } }
protected OrangePips Seeds { get { return null; } }
}
这并不特别有用,因为类已经通过提供protected
成员隐含了这个约定。
但是我们也可以这样做:
public interface IOrange : IOrangeSupport
{
...
}
因此,将 IOrangeSupport
应用于所有实现 IOrange
的类,并要求它们提供特定的 protected
成员——这是目前我们无法做到的。
class Base<T> { }
interface IDerived
{
string Secret { get; set; }
}
class Derived<T> : Base<T>, IDerived
{
protected string Secret;
protected void LearnSecret(IDerived other)
{
var x = other.Secret;
}
}
- hypehuman