如何在界面中将方法设为私有?

时间:2009-09-05 14:24:56

标签: c# interface

我有这个界面:

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是公共的,而不是我想要的私有。

我该如何更改?

7 个答案:

答案 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();
}

很抱歉加入太晚了。