Как я могу сделать метод приватным в интерфейсе?
У меня есть этот интерфейс:
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 является общедоступным, а не частным, как я хотел.
Как я могу это изменить?
Ответы
Ответ 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
}
Ответ 6
Вероятно, вы можете ознакомиться здесь в статье MSDN о интерфейсах: http://msdn.microsoft.com/en-us/library/ms173156.aspx
Ответ 7
Считаете ли вы использование:
void IValidationCRUD.AddError(ICRUDError error)
{
throw new System.NotImplementedException();
}
Вместо
public void AddError(ICRUDError error)
{
throw new System.NotImplementedException();
}
Извините, что присоединился слишком поздно.