Подтвердить что ты не робот

Как я могу сделать метод приватным в интерфейсе?

У меня есть этот интерфейс:

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 является общедоступным, а не частным, как я хотел.

Как я могу это изменить?

4b9b3361

Ответ 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);
}

Ответ 2

Частный член не имеет смысла как часть интерфейса. Интерфейс должен определять набор методов, роль, объект должен всегда реализовываться. С другой стороны, частные методы - это детали реализации, не предназначенные для общественного потребления.

Ответ 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() явно имплицируется, поэтому, если вы создали объект класса child, вы не получите функцию b()

Ответ 5

Правило интерфейса:

CLR также позволяет интерфейсу содержать статические методы, статические поля, константы и статические конструкторы. Однако интерфейс, совместимый с CLS, не должен иметь ни одного из этих статических элементов, поскольку некоторые языки программирования могут определять или получать к ним доступ. Фактически, С# не позволяет интерфейсу определять какие-либо статические элементы. Кроме того, CLR не позволяет интерфейсу содержать любые поля экземпляра или конструкторы экземпляров.

Это правила интерфейса, и вы ничего не можете сделать по этому поводу:)

Это не разрешено

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

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

Ответ 7

Считаете ли вы использование:

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

Вместо

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

Извините, что присоединился слишком поздно.