2012-04-13 2 views
11

Мне нужно знать, как предотвратить создание класса в .net?Лучший способ предотвратить запуск класса?

Я знаю несколько методов, таких как создание класса Abstract и Static.

Есть ли еще способ достичь этого?

+0

Почему не абстрактно – Trikaldarshi

+3

«Невозможность создания экземпляра» - это точное определение 'static class'. Зачем вам что-то еще? –

ответ

6

Маркировка конструктора private. Конечно, это не мешает классу создавать себя через метод static, например ...

Более практично, в чем цель запрещения создания экземпляра класса. Если у вас есть singleton, тогда нужен конструктор private. Если это необходимо для принудительного подкласса, то лучше сделать класс abstract; если это класс с полезными методами, что делает его static одним способом (тогда у вас могут быть только методы static).

+1

Я сделал это, но не работал, но я могу создать объект. –

+2

@RomeshSomani Это зависит от того, где вы пытаетесь создать экземпляр. Вам нужно полностью отрицать это, сделать его абстрактным. Извините, я имел в виду статичность. – asawyer

+0

Нет, аннотация имеет другую цель. Сделайте его статическим. –

14

Марк конструктор (s) private, protected или если используется из другой сборки, internal

+5

Он все еще может быть создан с использованием отражения. И если это не запечатанное, вы можете просто извлечь из него, а затем использовать защищенный конструктор, к которому у вас теперь есть доступ. – jason

+0

@Jason Это хорошие моменты! – asawyer

3

I need to know how to prevent a class from being Instantiated in .net?

Ваш вопрос не ясен.

Вы имеете в виду экземпляр в runtime? Сделайте класс abstract или static.

Вы имеете в виду, что конструктор недоступен в коде? Сделайте конструктор private. Но обратите внимание, что кто-то все еще может использовать отражение, чтобы захватить дескриптор конструктора и создать экземпляр экземпляра во время выполнения.

Итак, что вы имеете в виду?

+0

Я забыл о отражении, хороший момент. – asawyer

+0

Я попытался использовать Activator.CreateInstance с частным конструктором, и он создал исключение –

+0

@AdrianIftode Check, чтобы проверить, тянут ли ваши привязки частные члены. – asawyer

19

Создание класса статический - лучший подход, если вы абсолютно не хотите никаких экземпляров. Это останавливает кого-то от создания экземпляров. Класс будет запечатан и аннотация, и не будет любых конструкторов.

Кроме того, язык будет замечен, что это статический класс и не позволяет использовать его в разных местах, которые включают экземпляров, например. аргументы и переменные типа. Это указывает на намерение более четко, чем просто наличие частного конструктора, что может означать, что есть экземпляры, созданные в этом классе (например, для реализации singleton).

О, и что делает класс статический остановит вас от введения каких-либо бесполезные члены экземпляра в классе тоже :)

Смотрите MSDN для получения дополнительной информации о статических классов.

+0

Интересно, что касается статических классов, они вообще не выглядят (вообще-то вроде классов) (http://codecrafter.blogspot.ca/2009/09/c-static-classes-are-not-real-classes.html); они больше похожи на модули ... –

2

Если вопрос:

How can you make your class not be instanced without having your class be static or abstract ?

Тогда ответ на это осуществить singleton pattern, который в.NET 4+ это легко сделать с:

public sealed class myClass 
{ 
    private static readonly Lazy<myClass> lazyInstance = 
     new Lazy<myClass>(() => new myClass()); 

    public static Instance 
    { 
     get 
     { 
      return lazyInstance.Value; 
     } 
    } 

    private myClass() 
    { 
     // constructor logic here 
    } 
} 

Паттерн синглтон позволяет передавать свой класс вокруг в качестве ссылки на методы, в то же время гарантируя, что у вас есть только один экземпляр вашего класса. Это также упрощает тестирование, так как вы можете использовать экземпляр ImyClass, который реализует myClass, это очень полезно при создании макетных объектов.

Без .NET4 вы можете реализовать одноплодной шаблон, например:

private static readonly myClass instance = new myClass(); 

public static Instance 
{ 
    get 
    { 
     return instance; 
    } 
} 

// rest of code remains the same 

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

Таким образом, вопрос, скорее всего, задает вопрос, знаете ли вы шаблон singleton, и если вы признаете его важность для статических классов для модульных тестов и макетных объектов.

Как уже указывали другие, поля static, даже те, что обозначены readonly, могут быть установлены с отражением, кроме того, можно использовать конструктор private с использованием отражения. Если вам нужно предотвратить это, вам нужно сделать код вызова запущенным в менее надежном пространстве приложения, или вам нужно будет реализовать свой класс как static.

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

Смежные вопросы