Що є аргументом проти оголошення членів захищеного доступу на інтерфейсах? Це, наприклад, недійсне:
public interface IOrange
{
public OrangePeel Peel { get; }
protected OrangePips Seeds { get; }
}
У цьому прикладі інтерфейс IOrange
гарантує, що реалізатори принаймні надають OrangePips
екземпляр своїм спадкоємцям. Якби реалізатор хотів, вони могли б розширити область застосування повністю public
:
public class NavelOrange : IOrange
{
public OrangePeel Peel { get { return new OrangePeel(); } }
protected OrangePips Seeds { get { return null; } }
}
public class ValenciaOrange : IOrange
{
public OrangePeel Peel { get { return new OrangePeel(); } }
public OrangePips Seeds { get { return new OrangePips(6); } }
}
Метою protected
членів інтерфейсів є надання контракту на підтримку спадкоємців (підкласів), наприклад:
public class SpecialNavelOrange : NavelOrange
{
...
// Having a seed value is useful to me.
OrangePips seeds = this.Seeds;
...
}
(Слід визнати, це не буде працювати для struct
s)
Я не бачу великої кількості випадків private
або internal
модифікаторів в інтерфейсах, але підтримка обох public
та protected
модифікаторів видається цілком розумною.
Я спробую пояснити корисність protected
членів на interface
s, повністю відокремивши їх від interface
s:
Давайте уявимо нове ключове слово C # support
для забезпечення виконання контрактів спадкоємців, щоб ми декларували такі речі:
public support IOrangeSupport
{
OrangePips Seeds { get; }
}
Це дозволило б нам укласти класи для надання захищених членів своїм спадкоємцям:
public class NavelOrange : IOrange, IOrangeSupport
{
public OrangePeel Peel { get { return new OrangePeel(); } }
protected OrangePips Seeds { get { return null; } }
}
Це не особливо корисно, оскільки класи вже передбачають цей контракт, надаючи protected
спочатку членів.
Але тоді ми могли б зробити і таке:
public interface IOrange : IOrangeSupport
{
...
}
Тим самим застосовуючи IOrangeSupport
до всіх класів, які реалізують, IOrange
і вимагаючи від них надання конкретних protected
членів - що ми зараз не можемо зробити.