反对在接口上声明受保护访问成员的论点是什么?例如,这是无效的:
public interface IOrange
{
public OrangePeel Peel { get; }
protected OrangePips Seeds { get; }
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,接口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); …Run Code Online (Sandbox Code Playgroud) .Net 3.5中的新扩展允许从接口拆分功能.
例如在.Net 2.0中
public interface IHaveChildren {
string ParentType { get; }
int ParentId { get; }
List<IChild> GetChildren()
}
Run Code Online (Sandbox Code Playgroud)
可以(在3.5中)成为:
public interface IHaveChildren {
string ParentType { get; }
int ParentId { get; }
}
public static class HaveChildrenExtension {
public static List<IChild> GetChildren( this IHaveChildren ) {
//logic to get children by parent type and id
//shared for all classes implementing IHaveChildren
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,这对于许多接口来说是更好的机制.他们不再需要抽象基础来共享此代码,并且功能上代码的工作原理相同.这可以使代码更易于维护和更容易测试.
唯一的缺点是抽象基础实现可以是虚拟的,但可以解决(实例方法是否会隐藏具有相同名称的扩展方法?这会使代码混淆吗?)
没有经常使用这种模式的任何其他原因?
澄清:
是的,我看到扩展方法的趋势是到处都是它们.如果没有大量的同行评审,我会特别小心使用.Net值类型(我认为我们在字符串上唯一的一个是.SplitToDictionary()- 类似于.Split()但也采用键值分隔符)
我认为那里有一个完整的最佳实践辩论;-)
(顺便说一下:DannySmurf,你的PM听起来很可怕.)
我在这里特别询问使用扩展方法,以前我们有接口方法. …
我有一个继承接口的类.接口成员方法是在我的类中实现的,没有访问修饰符(因此,默认情况下它是私有的).
我收到错误"无法实现接口成员,因为它不公开".
为什么不允许这样做?我不能覆盖辅助功能吗?
可能重复:
为什么我不能拥有受保护的接口成员?
作为标题,在C#中.是否有人可能想要受保护或内部接口?
默认情况下,接口的所有成员都是公共的.但是我的界面中有一些属性我想用作实现我的界面的一些子类的私有成员.这是可以而且已经完成的事情,还是我在这里的基础.我现在正在我的架构中使用更多接口,所以我还不是那么精通.
我正在开发一个实现内部接口的内部类.任何人都可以解释为什么我不能将我的方法声明为内部,为什么我收到以下错误:"无法实现接口成员,因为它不公开".
我知道我必须将该方法声明为公开,但这对我来说绝对没有意义.
如果接口和类都是内部的,那么声明方法是公共的有什么意义呢?这不是误导吗?
正如标题中所述:为什么您添加到界面的每个功能都必须公开?
在接口中声明的所有方法都必须是公共的; 这是界面的本质
如上面引用中所述,界面的性质是什么?
如何让一个类实现一个接口,另一个类扩展该类.为什么不能在扩展主类的类中定义必要的方法?
请注意:我确实知道如何使用接口,但我只是想知道为什么这些东西不可能预定义.