C# имеет понятие частного и защищенного наследования?

Random rnd = new Random();
for (int i = ar.length - 1; i > 0; i--)
{
  int index = rnd.nextInt(i + 1);
  // Simple swap
  int a = ar[index];
  ar[index] = ar[i];
  ar[i] = a;
}

Кстати, я заметил, что этот код возвращает число элементов ar.length - 1, поэтому, если ваш массив имеет 5 элементов, новый перетасованный массив будет содержать 4 элемента. Это происходит потому, что цикл for говорит i>0. Если вы переходите на i>=0, вы получаете все элементы, перетасованные.

41
задан mmattax 29 August 2008 в 06:00
поделиться

8 ответов

Можно скрыть наследованные API от того, чтобы быть публично видимым путем объявления того же самого участника в классе как частного, и использования нового ключевого слова. См. Скрываться посредством Наследования из MSDN.

5
ответ дан bdukes 4 August 2019 в 21:57
поделиться

Если Вы хотите, чтобы класс NServlet не знал что-нибудь о Странице, необходимо изучить использование Шаблона "адаптер". Запишите страницу, которая разместит экземпляр класса NServlet. В зависимости от того, что точно Вы делаете, Вы могли тогда записать огромное количество классов, которые только знают о базовом классе NServlet, не имея необходимость загрязнять Ваш API участниками страницы asp.net.

3
ответ дан Joel Martinez 4 August 2019 в 21:57
поделиться

@bdukes: Следует иметь в виду, что Вы не действительно сокрытие участника. Например:

class Base
{
   public void F() {}
}
class Derived : Base
{
   new private void F() {}
}

Base o = new Derived();
o.F();  // works

, Но это выполняет то же как частное наследование в C++, который является тем, что хотел корреспондент.

5
ответ дан Robert Harvey 4 August 2019 в 21:57
поделиться

Нет, общедоступное наследование только.

1
ответ дан Chris Karcher 4 August 2019 в 21:57
поделиться

Вы, вероятно, хотите класс ServletContainer, который поднят трубку с реализацией NServlet. В моей книге не позволяя частный / защищенное наследование не является действительно грандиозным предприятием и сохраняет язык менее сбивающим с толку - с LINQ и т.д. у нас уже есть достаточно материала для запоминания.

1
ответ дан Daren Thomas 4 August 2019 в 21:57
поделиться

Нет это не делает. Что преимущество имело бы разрешение этого типа ограничения?

-3
ответ дан Scott Dorman 4 August 2019 в 21:57
поделиться

C# позволяет общедоступное наследование только. C++ позволил все три вида. Общедоступное наследование подразумевало тип "ISA" отношений, и частное наследование подразумевало "Is-Implemented-In-Terms-Of" вид отношений. Начиная с разделения на уровни (или состав) выполнил это возможно более простым способом, частное наследование только использовалось, когда абсолютно требуется защищенными участниками, или виртуальные функции потребовали его - по словам Scott Meyers в Эффективном C++, Объект 42.

Мое предположение было бы то, что авторы C# не чувствовали, что этот дополнительный метод реализации одного класса с точки зрения другого был необходим.

17
ответ дан McGarnagle 4 August 2019 в 21:57
поделиться

Нет, не просто. Какова польза от разрешения такого типа ограничений?

Частное и защищенное наследование полезно для инкапсуляции (сокрытия информации). Защищенное* наследование поддерживается в C++, хотя в Java его нет. Вот пример из моего проекта, где это было бы полезно.

Есть базовый класс в стороннем фреймворке**. Он имеет десятки параметров плюс свойства и методы для манипулирования ими. Базовый класс не делает много проверок при назначении отдельных настроек, но он будет генерировать исключение позже, если встретит неприемлемую комбинацию.

Я делаю дочерний класс с методами для назначения этих настроек (например, назначение тщательно продуманных настроек из файла). Было бы неплохо лишить остальной код (вне моего дочернего класса) возможности манипулировать отдельными настройками и портить их.

Тем не менее, я думаю, что в C++ (который, опять же, поддерживает частное и защищенное наследование) можно привести дочерний класс к родительскому и получить доступ к публичным членам родительского класса. (См. также пост Криса Карчера) Тем не менее, защищенное наследование улучшает сокрытие информации. Если члены класса B1 должны быть действительно скрыты внутри других классов C1 и C2, это можно сделать, создав защищенную переменную класса B1 внутри C1 и C2. Защищенный экземпляр B1 будет доступен для дочерних классов C1 и C2. Конечно, такой подход сам по себе не обеспечивает полиморфизм между C1 и C2. Но полиморфизм может быть добавлен (при желании) путем наследования C1 и C2 от общего интерфейса I1.

*** Для краткости будем использовать "protected" вместо "private и protected".

** National Instruments Measurement Studio в моем случае.

  • Nick
8
ответ дан 26 November 2019 в 23:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: