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
, вы получаете все элементы, перетасованные.
Можно скрыть наследованные API от того, чтобы быть публично видимым путем объявления того же самого участника в классе как частного, и использования нового ключевого слова. См. Скрываться посредством Наследования из MSDN.
Если Вы хотите, чтобы класс NServlet не знал что-нибудь о Странице, необходимо изучить использование Шаблона "адаптер". Запишите страницу, которая разместит экземпляр класса NServlet. В зависимости от того, что точно Вы делаете, Вы могли тогда записать огромное количество классов, которые только знают о базовом классе NServlet, не имея необходимость загрязнять Ваш API участниками страницы asp.net.
@bdukes: Следует иметь в виду, что Вы не действительно сокрытие участника. Например:
class Base
{
public void F() {}
}
class Derived : Base
{
new private void F() {}
}
Base o = new Derived();
o.F(); // works
, Но это выполняет то же как частное наследование в C++, который является тем, что хотел корреспондент.
Вы, вероятно, хотите класс ServletContainer, который поднят трубку с реализацией NServlet. В моей книге не позволяя частный / защищенное наследование не является действительно грандиозным предприятием и сохраняет язык менее сбивающим с толку - с LINQ и т.д. у нас уже есть достаточно материала для запоминания.
Нет это не делает. Что преимущество имело бы разрешение этого типа ограничения?
C# позволяет общедоступное наследование только. C++ позволил все три вида. Общедоступное наследование подразумевало тип "ISA" отношений, и частное наследование подразумевало "Is-Implemented-In-Terms-Of" вид отношений. Начиная с разделения на уровни (или состав) выполнил это возможно более простым способом, частное наследование только использовалось, когда абсолютно требуется защищенными участниками, или виртуальные функции потребовали его - по словам Scott Meyers в Эффективном C++, Объект 42.
Мое предположение было бы то, что авторы C# не чувствовали, что этот дополнительный метод реализации одного класса с точки зрения другого был необходим.
Нет, не просто. Какова польза от разрешения такого типа ограничений?
Частное и защищенное наследование полезно для инкапсуляции (сокрытия информации). Защищенное* наследование поддерживается в C++, хотя в Java его нет. Вот пример из моего проекта, где это было бы полезно.
Есть базовый класс в стороннем фреймворке**. Он имеет десятки параметров плюс свойства и методы для манипулирования ими. Базовый класс не делает много проверок при назначении отдельных настроек, но он будет генерировать исключение позже, если встретит неприемлемую комбинацию.
Я делаю дочерний класс с методами для назначения этих настроек (например, назначение тщательно продуманных настроек из файла). Было бы неплохо лишить остальной код (вне моего дочернего класса) возможности манипулировать отдельными настройками и портить их.
Тем не менее, я думаю, что в C++ (который, опять же, поддерживает частное и защищенное наследование) можно привести дочерний класс к родительскому и получить доступ к публичным членам родительского класса. (См. также пост Криса Карчера) Тем не менее, защищенное наследование улучшает сокрытие информации. Если члены класса B1 должны быть действительно скрыты внутри других классов C1 и C2, это можно сделать, создав защищенную переменную класса B1 внутри C1 и C2. Защищенный экземпляр B1 будет доступен для дочерних классов C1 и C2. Конечно, такой подход сам по себе не обеспечивает полиморфизм между C1 и C2. Но полиморфизм может быть добавлен (при желании) путем наследования C1 и C2 от общего интерфейса I1.
*** Для краткости будем использовать "protected" вместо "private и protected".
** National Instruments Measurement Studio в моем случае.