2012-06-26 2 views
3

У меня есть класс ClassA, который является базовым классом других классов. Я хочу, чтобы этот конструктор классов был внутренним и защищенным, так что он не может быть унаследован и создан из-за пределов моей сборки (я не могу сделать его запечатанным, потому что у меня есть другие внутренние классы, наследующие его, вы можете увидеть мой другой связанный с ним вопрос here), поэтому я изменил его, чтобы быть похожим на это:Защищенный внутренний конструктор

public abstract ClassA{ 
    internal protected ClassA(){ 
    } 
} 

Мне сказали, что это не будет работать, как комбинация internal protected интерпретируется как internal ИЛИ protected, который, по-видимому делает конструктор только protected :((видимый из наружный)

Вопросы

  1. Если это правда, то почему internal protected интерпретируется как internal ИЛИ protected а не как internal И protected?
  2. Есть ли способ объявить конструктор внутренним и защищенным?

ответ

6

Указание внутреннего достаточно.

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

+1

Собственно, это неправда. Снаружи сборщика «защищенный» модификатор все еще вступает в игру. Если вы объявляете пустой конструктор только как «внутренний», вы можете наследовать класс вне сборки, но вы не можете добавить к нему настраиваемый конструктор. Если вы сделаете это «защищенным внутренним», тогда вы сможете. – RobinHood70

+1

@ RobinHood70 Я просто ответил на его конкретный запрос. В общем случае вы правы. – Asti

0

Вы попробовали?

MSDN говорят нам, что

Конструкторы могут быть отмечены как государственные, частные, защищенный, внутренний или защищен внутренним.

http://msdn.microsoft.com/en-us/library/ms173115%28v=vs.100%29.aspx

+0

Да, я попробовал и смутился, поэтому мой вопрос :) – GETah

4

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

  • Protected - видимый для всех классов, которые наследуют от А в своем и в любом другом собрании
  • Внутренний - видимый для всех классов в сборке кЛАССА а в
  • Protected Внутренний - видимый для всех классов, которые наследуют от а в своем и в любом другом собрании и для всех классов в узел а по

Так что в этом случае вам нужно только указать конструктор как внутренний.