我有这个界面:
public interface IValidationCRUD
{
public ICRUDValidation IsValid(object obj);
private void AddError(ICRUDError error);
}
但是当我使用它时(实现接口,自动生成代码),我得到了这个:
public class LanguageVAL : IValidationCRUD
{
public ICRUDValidation IsValid(object obj)
{
throw new System.NotImplementedException();
}
public void AddError(ICRUDError error)
{
throw new System.NotImplementedException();
}
}
方法AddError是公共的,而不是我想要的私有。
我该如何更改?
答案 0 :(得分:42)
接口只能有公共方法。您可以考虑使用带有受保护抽象方法AddError
的抽象基类。然后,基类可以实现IValidationCRUD
接口,但只有在删除了私有方法之后才能实现。
public interface IValidationCRUD
{
ICRUDValidation IsValid(object obj);
}
public abstract class ValidationCRUDBase: IValidationCRUD {
public abstract ICRUDValidation IsValid(object obj);
protected abstract void AddError(ICRUDError error);
}
答案 1 :(得分:30)
私有成员作为界面的一部分毫无意义。接口用于定义一组方法,一个角色,一个对象必须始终实现。另一方面,私有方法是实施细节,不是为了公共消费。
答案 2 :(得分:6)
接口不能包含私有字段。 但是,您可以实现的最接近“私有字段”的行为是使用显式实现(在此解释:http://msdn.microsoft.com/en-us/library/ms173157.aspx)
答案 3 :(得分:4)
在实际情况下它不是一个有效的场景,但你仍然可以通过接口
的显式实现来实现 interface Itest
{
void functiona();
void functionb();
}
class child : Itest
{
public void functiona()
{
}
void Itest.functionb()
{
}
}
这里functionb()被明确表示,所以如果你创建了class child的对象,你就不会得到functionb()
答案 4 :(得分:1)
界面规则:
CLR还允许接口包含静态 方法,静态字段,常量和静态构造函数。但是,符合CLS的接口不能具有任何这些静态成员,因为某些编程语言无法定义或访问它们。实际上,C#阻止接口定义任何静态成员。此外,CLR不允许接口包含任何实例字段或实例构造函数。
这些是界面的规则,你不能做任何事情:)
不允许这样做
interface IIValidationCRUD
{
static ICRUDValidation IsValid(object obj); //error
}
interface IIValidationCRUD
{
public ICRUDValidation IsValid(object obj); //error
}
答案 5 :(得分:0)
您可能应该查看有关接口的MSDN文章:http://msdn.microsoft.com/en-us/library/ms173156.aspx
答案 6 :(得分:0)
您是否考虑过使用:
void IValidationCRUD.AddError(ICRUDError error)
{
throw new System.NotImplementedException();
}
而不是
public void AddError(ICRUDError error)
{
throw new System.NotImplementedException();
}
很抱歉加入太晚了。