|
Программирование >> Программирование с использованием ajax
Vehicle Train
Puc. 9.15. Диаграмма классов, представляющих автомобили Некоторые из классов ниже в иерархии могут иметь общие характеристики по своему предназначению, а не только по тому классу, от которого наследуются. Например, классы PassengerTrain, Compact, SUV и Pickup допускают возможность перевозки пассажиров, а раз так, значит, они могут обладать общим интерфейсом IPassengerCarrier (Пассажирский транспорт). Классы FreightTrain и PickUp допускают возможность перевозки тяжелых грузов, а раз так, значит, могут тоже иметь общий интерфейс IHeavyLoadCarrier (Транспорт для перевозки тяжелых грузов), как показано на рис. 9.16. Vehicle
Compact SUV
interface* IPassengerCarrier interface* IHeavyLoadCarrier Puc. 9.16. Интерфейсы IPassengerCarrier и IHeavyLoadCarrier Путем разбиения системы объектов подобным образом перед назначением конкретных деталей можно легко определять, где лучше использовать абстрактные классы, а не интерфейсы, а где наоборот, лучше использовать интерфейсы, а не абстрактные классы. Результата, получившегося в этом примере, не удалось бы достигнуть путем применения только интерфейсов или только наследования абстрактных классов. Типы-структуры в главе 8 уже отмечалось, что структуры и классы очень похожи между собой, но только структуры представляют собой типы-значения, а классы - ссылочные типы. Что это на самом деле означает? Легче всего будет объяснить на конкретном примере, вроде того, что предлагается в следующем практическом занятии. или структуры 1. Создайте новый проект консольного приложения по имени Ch09Ex03 и сохраните его в каталоге С: \BegVCSharp\Chapter09. 2. Измените его код следующим образом: namespace Ch09Ex03 { class MyClass public int val; struct myStruct public int val; class Program static void Main(string[] args) { MyClass objectA = new MyClass () ; MyClass objects = objectA; objectA. val = 10; objects.val = 20; myStruct structA = new myStruct () ; myStruct structS = structA; StructA. val = 30; StructS.val =40; Console.WriteLine( ObjectA.val = {0} , objectA.val) Console.WriteLine( objects.val = {0} , objects.val) Console.WriteLine( StructA.val = {0} , structA.val) Console.WriteLine( structB.val = { 0} , structS.val) Console.ReadKey(); 3. Запустите приложение. На рис. 9.17 показан результат, который должен получиться. I hkJ./C B gVCSIuiBChapl rt)9,Cn09brtl3;
Puc. 19.17. Приложение Ch09Ex03 в действии Описание полученных результатов в этом примере в приложение сначала добавляются определения двух типов: определение структуры по имени myStruct, имеющей одно общедоступное поле val, и определение класса по имени MyClass, который содержит идентичное поле (о членах классов, таких как поля, более подробно будет рассказываться в главе 10; пока что важно усвоить лишь то, что синтаксис выглядит одинаково). Далее для экземпляров обоих этих типов выполняются следующие одинаковые операции. 1. Объявляется переменная данного типа. 2. Создается новый экземпляр данного типа в этой переменной. . Объявляется вторая переменная данного типа. 4. Второй переменной присваивается первая переменная. 5. Присваивается значение полю val в экземпляре первой переменной. 6. Присваивается значение полю val в экземпляре второй переменной. 7. Значения полей val обеих переменных отображаются на экране. Хотя выполняемые для переменных обоих типов операции выглядят одинаково, исход получается разный. При отображении значения поля val типы-объекты имеют одинаковые значения, а типы-структуры - разные. Почему? Дело в том, что объекты представляют собой ссылочные типы. При присваивании объекта переменной фактически этой переменной присваивается просто указатель на объект, на который она должна ссылаться. На языке кода указателем называется адрес в памяти. В данном случае этим адресом является ячейка в памяти, где находится объект. При присваивании первой ссылки на объект второй переменной типа MyClass с помощью показанной ниже строки кода фактически осуществляется копирование этого адреса: MyClass objectB = objectA; В результате получается, что в обеих переменных содержатся просто указатели на один и тот же объект. Что касается структур, то они представляют собой типы-значения. Вместо указателя на структуру в переменной содержится сама структура. Поэтому при присваивании первой структуры второй переменной типа rayStruct с помощью показанной ниже строки кода, фактически осуществляется копирование всей информации из одной структуры в другую: myStruct structB = structA; Подобное поведение уже встречалось ранее в книге при рассмотрении простых типов переменных вроде int. Его результатом в данном случае является то, что в двух переменных типа структуры оказываются разные структуры. Процесс применения
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |