Как скрыть заданный метод реализованного свойства от интерфейса в C #? - PullRequest
0 голосов
/ 01 мая 2011

Приветствую всех ...

Если у меня есть следующий интерфейс:

interface IMyInterface
{
    int property { get; set; }
}

И следующая реализация:

class MyClass : IMyInterface
{
// anything
}

Как мне скрыть set метод свойства из экземпляров MyClass ... Другими словами, я не хочу, чтобы set метод property был общедоступным, это возможно?

Было былегко сделать с абстрактным классом:

abstract class IMyInterface
{
    int property { get; protected set; }
}

Тогда я смогу только set property внутри класса, который реализует абстрактный класс выше ...

Ответы [ 5 ]

7 голосов
/ 01 мая 2011

У вас нет set в интерфейсе для начала. Вы все еще можете реализовать его как private.

Вы не можете «спрятать» это, это часть контракта. Если вы не хотите, чтобы это было частью договора, не определяйте его.

2 голосов
/ 01 мая 2011

Если вы используете следующий интерфейс, метод set будет недоступен при манипулировании классами через интерфейс:

interface IMyInterface
{ 
   int property { get; }
}

Затем вы можете реализовать класс следующим образом:

class MyClass : IMyInterface
{
  int property { get; protected set; }
}
1 голос
/ 24 апреля 2012

Если в некоторых реализациях будут реализованы только некоторые части интерфейса, было бы неплохо разделить интерфейс на части, которые каждая реализация будет реализовывать полностью или не реализовывать вовсе, а затем определить интерфейсы, которые наследуют все общие комбинации.из них.Адаптируем ваш пример:

interface IMyReadableInterface
{
    int property { get; }
}
interface IMyFullInterface : IMyReadableInterface
{
    new int property { get; set; }
}

Классы, которые хотят поддерживать доступ для чтения и записи, должны реализовывать IMyFullInterface;Те, которые хотят поддерживать только чтение, должны реализовывать только IMyReadableInterface.Эта сегрегация не потребует дополнительной работы для реализаций любого интерфейса, которые написаны на C # и неявно реализуют property.Код, который реализует property в VB или явно реализует property в C #, должен определять две реализации property - только для чтения и чтения-записи, но такова жизнь.Обратите внимание, что хотя можно определить IMyWritableInterface, у которого только что был установщик, и IMyFullInterface наследует IMyReadableInterface и IMyWritableInterface, IMyFullInterface все равно придется определять собственное свойство чтения-записи, и когдаиспользуя явную реализацию, нужно было бы определить три свойства (я действительно не понимаю, почему C # не может использовать свойство только для чтения и только для записи, так как считал, что это свойство для чтения и записи,но не может).

1 голос
/ 01 мая 2011

Предполагая, что сеттер должен быть частью интерфейса, но по какой-то причине не имеет смысла использовать его в конкретном устройстве реализации (в данном случае MyClass), вы всегда можете вызвать исключение в сеттере (например InvalidOperationException). Это не защитит вас во время компиляции, только во время выполнения. Это немного странно, поскольку код, работающий с интерфейсом, не знает, разрешен ли вызов метода set.

0 голосов
/ 01 мая 2011

В интерфейсе нет защищенного или частного, все общедоступно. Либо вы не определяете какой-либо набор, либо используете его как публичный.

...