Известная проблема с шаблонами - это раздувание кода, что является следствием генерации определения класса в каждом модуле, который вызывает специализацию шаблона класса. Чтобы предотвратить это, начиная с C ++ 0x, перед спецификацией шаблона класса
#include <MyClass>
extern class CMyClass<int>;
можно использовать ключевое слово extern . Явное инкрементирование класса шаблона должно происходить только в одной единице перевода, предпочтительнее вариант с определением шаблона (MyClass.cpp)
template class CMyClass<int>;
template class CMyClass<float>;
Используйте вложенный класс, когда класс, Вы - вложение, только полезен для класса включения. Например, вложенные классы позволяют Вам писать, что чему-то нравится (упрощенный):
public class SortedMap {
private class TreeNode {
TreeNode left;
TreeNode right;
}
}
можно сделать полное определение класса в одном месте, Вы не должны переходить ни через какие обручи PIMPL, чтобы определить, как Ваш класс работает, и внешний мир не должен видеть ничего Вашей реализации.
, Если бы класс TreeNode был внешним, необходимо было бы или сделать все поля public
или сделать набор get/set
методы для использования его. Внешний мир имел бы другой класс, загрязняющий их intellisense.
Если я понимаю право статьи Katheleen, она предлагает использовать вложенный класс, чтобы быть в состоянии записать SomeEntity. Набор вместо EntityCollection< SomeEntity>. По-моему, это - спорный способ сохранить Вас некоторый ввод. Я вполне уверен, который в наборах приложения реального мира будет иметь некоторое различие в реализациях, таким образом, необходимо будет создать отдельный класс так или иначе. Я думаю, что использование имени класса для ограничения другого объема класса не является хорошей идеей. Это загрязняет intellisense, и усильте зависимости между классами. Используя пространства имен стандартный способ управлять объемом классов. Однако я нахожу, что использование вложенных классов как в комментарии @hazzen приемлемо, если у Вас нет тонн вложенных классов, который является знаком плохого дизайна.
Это зависит от использования. Я редко когда-либо использовал бы вложенный класс Общественности, но использовать Частные вложенные классы все время. Частный вложенный класс может использоваться для подобъекта, который предназначается, чтобы использоваться только в родителе. Пример этого был бы то, если класс HashTable содержит частный объект Записи хранить данные внутренне только.
, Если класс предназначен, чтобы использоваться вызывающей стороной (внешне), мне обычно нравится делать его отдельным автономным классом.
Из Учебного руководства по Java Sun:
, Почему Использование Вложенные Классы? Существует несколько неопровержимых доводов использования вложенных классов среди них:
Логическая группировка classes—, Если класс полезен только для еще одного класса, то логично встроить его в тот класс и держать два вместе. Вложение такие "классы помощника" делает их пакет более оптимизированным.
Увеличенные encapsulation— Рассматривают два класса верхнего уровня, A и B, где B нужен доступ к членам, который был бы иначе объявлен частный. Путем сокрытия класса B в классе A члены A могут быть объявлены частные, и B может получить доступ к ним. Кроме того, B самостоятельно может быть скрыт от внешнего мира. < - Это не относится к реализации C# вложенных классов, это только относится к Java.
Полностью ленивый и потокобезопасный одноэлементный шаблон
public sealed class Singleton
{
Singleton()
{
}
public static Singleton Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested()
{
}
internal static readonly Singleton instance = new Singleton();
}
}
источник: http://www.yoda.arachsys.com/csharp/singleton.html