03 семестр / К экзамену-зачёту / Ответы на билеты / билет 14
.doc1)Ссылочные типы
Все ссылочные типы произведены от базового типа object, являющегося точным эквивалентом класса System.Object . Сам по себе тип object в основном используется для упаковки значений, подробно обсуждавшейся выше. Другая, более важная роль типа object заключается в том, что он является корнем для всей иерархии объектов в .NET и по умолчанию все классы унаследованы именно от System.Object . Классы могут иметь свои поля, методы, реализовывать интерфейсы и т.п. Так как классы представляют собой основной механизм организации программ и данных в C#, мы уделим им особое внимание в последующих слайдах.
Интерфейс представляет собой ссылочный тип, который может иметь только абстрактные элементы
Общая система типов (CTS)
В этой части будет описаны понятия и определены термины, облегчающие понимание общей системы типов. CTS определяет, как типы объявляются, используются и управляются во время исполнения. CTS поддерживает две категории типов, каждая из которых, в свою очередь, делиться на две большие категории: • Структурные типы – содержат локальные копии данных, а состояние структурного типа храниться в стеке или расположено непосредственно в виде участка памяти. Они могут быть как встроенные (реализуемые средой исполнения), так и определяться пользователем. • Ссылочные типы – хранят указатели на значения в адресном пространстве, и их данные расположены в области управляемой кучи. Так как переменные структурных типов хранят собственные копии данных, операции с одной переменной не влияют на другие переменные. В случае же с переменными ссылочных типов возможна ситуация, когда несколько переменных могут указывать на один и тот же объект; соответственно, операции, выполняемые с одной переменной, влияют на объект, на который указывает другая переменная. Переменные целочисленных типов и перечисления также являются структурными данными. Все типы производны от базового типа System.Object. Удаление переменных описанных типов происходит по-разному. Переменные структурных типов удаляются при выходе за область видимости переменной, а переменные ссылочных типов уничтожаются при выполнении сборки мусора.
2) Сокрытие методов. Это и есть инкапсуляция т.е. сокрытие внутренней структуры данных и реализации методов объекта от остальной программы. Другим объектам доступен лишь интерфейс объекта, через который осуществляется всё взаимодействие с ним.
class Array {
public:
void Alloc(int _len);
void Free();
inline double Elem(int i);
inline void ChangeElem(int i, double x);
protected:
int len;
double* val;
};
void Array::Alloc(int new_len)
{if (len>0) Free(); len=new_len; val=new double[new_len];}
void Array::Free() {delete [] val; len=0;}
inline double Array::Elem(int i)
{assert(i>=0 && i<len); return val[i];}
inline void Array::ChangeElem(int i, double x)
{assert(i>=0 && i<len); val[i]=x;}
Рассмотрим особенности реализации сокрытия данных в языке программирования C#.
Заметим, что в языке C# существует возможность описания объектов как экземпляров в составе подкласса с использованием зарезервированного слова new. При этом происходит сокрытие одноименных наследуемых экземпляров в подклассах.
Проиллюстрируем особенности использования механизма сокрытия данных в языке программирования C# следующим фрагментом программы:
class A {
public int x;
public void F() {
...
}
public virtual void G()
{
...
}
}
class B : A {
public new int x;
public new void F()
{
...
}
public new void G()
{
...
}
}
B b = new B();
b.x = ...;
// имеет доступ к B.x
b.F(); ... b.G();
// вызывает B.F и B.G
((A)b).x = ...;
// имеет доступ к A.x
((A)b).F();
...
((A)b).G();
// вызывает A.F и A.G
3) Для того, чтобы объявить закрытые классы и методы необходимо определить спецификатор доступа, в данном случае это private.