На главную. К полному списку вопросов.

15. Написать класcы a, b и шаблон L так чтобы L< a > *pa; L < b > *pb; pa = pb.

16. Даны выражения: const char* s, char const* s, char* const s, const char* const s. Расскажите что они значат.

17. Как подсчитать количество едениц в байте?

Вопросы по С#.

18. Дан класс, или несколько классов с какой-то частью имеющей схожую функциональность. Требуется создать третий класс, который бы работал с этой схожей функциональностью, при условии что я не могу наследоваться от этих классов.

19. Сколько типов в С# предназначенны для работы со строками? Укажите в чём их принципиальные различия.

20. Зачем нужны интерфейсы IPrincipal и IDisposable?

21. Что такое singleton? Опишите принцип его работы.

22. Чем статические методы отличаются от обычных?

15. Написать класcы a, b и шаблон L так чтобы L< a > *pa; L < b > *pb; pa = pb.

Оператор = нельзя переопределить для указателей. Можно только для экземпляров класса!
	template < class T >
	class L : public T{

	};
	class a {
	    
	};
	
	class b: public L< a > {
	    
	};

	int _tmain(int argc, _TCHAR* argv[])
	{
		L< a >* pa = new L< a >;
		L< b >* pb = new L< b >;
		pa = pb;
		return 0;
	}


наверх.

16. Даны выражения: const char* s, char const* s, char* const s, const char* const s. Расскажите что они значат.

В операциях с указателями участвуют два объекта: сам указатель и объект, на который он ссылается. Помещение ключевого слова const перед объявлением указателя делает константой объект, а не указатель. Для объявления самого указателя в качестве константы, используется оператор *const, а не просто *. Нет операторя объявления const*, поэтому ключевое слово const слева от * интерпретируется как часть базового типа.

const char* s - указатель на константу типа char.

char const* s - указатель на константу типа char.

char *const s = "значение" - константный указатель на char. Он должен быть инициализировн каким-либо значением или быть обьявлен как extern. Так же места "значения" может быть указатель типа char*.

const char *const s = "значение" - константный указатель на константу типа char


наверх.

17. Как подсчитать количество едениц в байте?

Проще всего битовые поля:

		struct byte
		{
			unsigned char b1:1;
			unsigned char b2:1;
			unsigned char b3:1;
			unsigned char b4:1;
			unsigned char b5:1;
			unsigned char b6:1;
			unsigned char b7:1;
			unsigned char b8:1;
		};
		union bits
		{
			char symb;
			struct byte bit;
		} u;
		u.symb = 240;
		unsigned char k = 0;
		k = u.bit.b1+u.bit.b2+u.bit.b3+u.bit.b4+u.bit.b5+u.bit.b6+u.bit.b7+u.bit.b8 ;
		int k1 = k;


наверх.

Вопросы по С#.

18. Дан класс, или несколько классов с какой-то частью имеющей схожую функциональность. Требуется создать третий класс, который бы работал с этой схожей функциональностью, при условии что я не могу наследоваться от этих классов.

Надо уточнить что подразумевается под схожей функциональностью. Если под ней понимается наличие функций с идентичными сигнатурами и разными реализациями, то самое простое это : Cоздать интерфейс, с общими методами и реализовать его в классах - источниках. А потом в классу приёмнику передать объект интерфейса, либо как параметр функции, либо конструктора.

Если же под схожестью понимается какая-то общая область, т.е. функции имеют различные сигнатуры но делают похожие вещи, то такой ответ:
Эту задачу можно решить с помощью паттерна проектирования Visitor. Паттерн проектирования - описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте. Патерн Vizitor - описывает операцию, выполняемую с каждым объектом из некоторой структуры. Паттерн Visitor позволяет определить новую операцию, не изменяя классы этих объектов. Как решение именно этой конктретной задачи можно рассмотреть такой вариант:
Надо наследовать эти классы от одного общего, в котором есть виртуальный метод Visit, в нутри которого вызываются нужные нам методы. А наш класс просто вызывает этот метод.

P.S. Тут просто ситуация, когда вам могут задать этот вопрос с целью проверить ваше знание паттернов, и ответом на этот вопрос будут ждать рассказа о паттерне Visitor.


наверх.

19. Сколько типов в С# предназначенны для работы со строками? Укажите в чём их принципиальные различия.

Типы - System.String и множество типов System.Text а так же его подмножество System.Text.RegularExpressions. System.String - это базовый тип. Он во время инициализации создаёт строку и предлагает ряд методов для работы с ней. Но у него есть недостаток, он инициализирует строку 1 раз и не меняет её в процессе работы. Это так называемый неизменяемый тип данных. Т.е. при попытке что-либо изменить в строке будет создаваться новая строка, а старая оставаться неизменной. Чтоб не плодить в памяти множество строк есть класс System.Text.StringBuilder. Он выделаят пямать под строку, либо вы её выделяете сами в момент инциализации класса и работает в рамках выделенной памяти, в том случае когда памяти не хватает он довыделяет ещё кусок памяти к уже существующей. Остальные класы предназначенны для преобразования из одной кодировки в другую и для реализации регулярных выражений.

наверх.

20. Зачем нужны интерфейсы IDisposable и IPrincipal?

IDisposable - это интерфейс с одним методом - Dispose(), который следует перегрузить в классе для того чтоб он освобождал нужные вам ресурсы. Его испльзуют для того чтоб ресурсы используемые классом освобождались не когда ссылка на них выйдет из области видимости и до них доберётся сборщик мусора, а сразу же после того как они вышли из области видимости. Так же для того чтоб не вызывать метод Dispose() вашего класса явно в коде используют ключевое слово using(){}, где в скобках помещают инициализацию класса а в нутри фигурных скобок осуществляется работа с ним. Фигурные скобки определяют область видимости инициализированного класса. Если вариант с using вам не подходит, то следует вызывать метод Dispose() явно.
IPrincipal - это интерфейс предназначенный для организации защиты приложений. С помощью интерфейса IPrincipal можно реализовать код проверяющий, можно ли выполнять защищённый код для этого пользователя, а так же код устанавливающий разрешения для данного пользовавтеля. У него есть свойство Identity( позваляет установить или получить группу пользователей к которой относится данный пользователь) и метод IsInRole позволяет узнать имеет ли данная группа необходимое разрешение.

наверх.

21. Что такое singleton? Опишите принцип его работы.

Singletone - это паттерн, поэтому сначало определение патерна:
Паттерн проектирования - описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте.
Singletone - это паттерн проектирования, который гарантирует, что некоторый класс может иметь только один экземпляр и предоставляет глобальную точку доступа к нему. Он имеет статическое поле с указателем на созданный экземляр и статический метод, позволяющий создавать экземпляр или предоставлять к нему доступ. Конструктор с деструктором при этом объявляются либо как Protected, либо как Private, чтобы их нельзя бало вызвать напрямую. Создание объекта этого класса делается только через статическую функцию. Protected делают для того чотб можно было создать экземпляр в потомках и регестрировать его в неком массиве singleton'ов. Обращаться к которому можно толко через Instance. Простой пример singletone:

	class Singleton
	{ 
      private static object SyncRoot = new object();
      private static Singleton _instance = null;  
      private Singlton(){};			
      
      public static Singleton Instance
		{
			get
			{
				if(_instance == null)
				{
					lock(SyncRoot)
					{
						if(_instance == null)	_instance = new Singleton();
					}
				}
				return _instance;
			}
		}
     	...
     }  

наверх.

22. Чем статические методы отличаются от обычных?

Статические методы, как и поля относятся к классу в целом, а не к конкретному объекту этого класса. Т.е. статические методы не получают указателя this, отсюда не имеют доступа к обычным методам и параметрам класса. Если в одном классе объявить 2 метода с идентичными сигнатурами, один из которых будет статическим, а другой обычным, то компилятор выдаст ошибку. Пример, ниже компилироваться не будет:

		class A
		{	
			public static void U(){}
			public void U(){}
		}

наверх.
Hosted by uCoz