【问题标题】:How can I make a method private in an interface?如何在接口中将方法设为私有?
【发布时间】:2010-11-25 21:18:41
【问题描述】:

我有这个界面:

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

我该如何更改?

【问题讨论】:

  • 我很惊讶这个编译,我敢肯定,当我一直在“自动驾驶”上输入一个界面并添加“公共”时,没有想到编译器会抱怨我。
  • 它无法编译。接口中不能有私有方法,甚至不允许指定公共方法,因为这对接口的所有成员都是隐含的。
  • 我只是写了接口,然后尝试在其他类上使用它。 Visual Studio 不能编译它。

标签: c# interface


【解决方案1】:

接口只能有公共方法。为此,您可能会考虑使用带有受保护抽象方法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);
}

【讨论】:

  • 一个(格式良好的)接口只能有公共方法。有趣的是,CLR 支持常量、字段,甚至接口的静态(类型)构造函数。这是因为接口的实现与任何其他类型定义一样。
  • 接口上的字段不符合 CLS,不是吗?
  • 正确。符合 CLS 的接口不能包含静态成员,因为 c# 等语言无法定义或访问它们。
  • @RobertVenables:使用内部成员声明的接口会产生什么影响?如果行为是该接口类型的引用可以与外部代码交换,但只有声明接口的程序集可以实现它,那将是有用的行为。
  • @supercat 我认为这就是我将使用抽象基类的目的,因为这是实现的一部分,而不是接口的用途。
【解决方案2】:

私有成员作为接口的一部分毫无意义。接口用于定义一组方法、一个角色、一个对象必须始终实现。另一方面,私有方法是实现细节,不适合公共使用。

【讨论】:

  • 你不能。指定访问修饰符(私有或公共)会导致编译错误。
  • 接口应该被看作是一种机制来执行一个类对类用户的契约。它保证 X,Y,Z,... 方法将始终可供类的外部用户使用。但是,令人讨厌的是,有时,您希望省去实现您希望类的程序员在实现类本身时可以访问的方法的麻烦。您可以通过继承另一个具体或抽象类来做到这一点,但由于 C# 不支持多重继承,因此您无法混合搭配,因此您需要借助组合。
【解决方案3】:

接口不能包含私有字段。 但是,您可以实现的最接近“私有字段”的行为是使用显式实现(此处解释:http://msdn.microsoft.com/en-us/library/ms173157.aspx

【讨论】:

    【解决方案4】:

    在实际情况下它不是一个有效的场景,但你仍然可以通过接口的显式实现来实现

     interface Itest
     {
          void functiona();
          void functionb();
     }
    class child : Itest
    {
         public void functiona()
         {
         }
         void Itest.functionb()
         {
         }
    }
    

    这里 functionb() 是明确隐含的,所以如果你创建了 class child 的对象,你将不会得到 functionb()

    【讨论】:

      【解决方案5】:

      接口规则:

      CLR 还允许接口包含静态 方法、静态字段、常量和静态构造函数。但是,符合 CLS 的接口不能有任何这些静态成员,因为某些编程语言无法定义或访问它们。事实上,C# 阻止接口定义任何静态成员。此外,CLR 不允许接口包含任何实例字段或实例构造函数。

      这些是界面的规则,你不能对此做任何事情:)

      这些都是不允许的

      interface IIValidationCRUD
      {
          static ICRUDValidation IsValid(object obj); //error
      }
      
      interface IIValidationCRUD
      {
          public ICRUDValidation IsValid(object obj); //error
      }
      

      【讨论】:

        【解决方案6】:

        您是否考虑过使用:

        void IValidationCRUD.AddError(ICRUDError error)
            {
                throw new System.NotImplementedException();
            }
        

        代替

        public void AddError(ICRUDError error)
        {
            throw new System.NotImplementedException();
        }
        

        抱歉加入太晚了。

        【讨论】:

          猜你喜欢
          • 2020-03-17
          • 1970-01-01
          • 2022-06-11
          • 2010-10-01
          • 2011-04-26
          • 1970-01-01
          • 2013-03-16
          • 2018-06-21
          • 1970-01-01
          相关资源
          最近更新 更多