Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Ватсон К. -> "С#" -> 98

С# - Ватсон К.

Ватсон К. С# — Лори, 2005 . — 879 c.
ISBN 1-861004-98-2
Скачать (прямая ссылка): vatsonc2005.pdf
Предыдущая << 1 .. 92 93 94 95 96 97 < 98 > 99 100 101 102 103 104 .. 404 >> Следующая


Некоторые нз этих классов на более низких уровнях иерархии могут обладать одинаковыми характеристиками, которые определяются нх предназначением, а не тем, производными ОТ какого класса онн ЯВЛЯЮТСЯ. Например, PassengerTrain,
Определение классов

199

Vehicle

Car

Trwln


-1 1
Compact Pickup SUV




1
PauangarTnln FreightTrain 424DoublaBogay



compact, suv и Pickup могут перевозить пассажиров, поэтому у них может .быть интерфейс iPaseenaerCarrier (перевозчик пассажиров). FreightTrain и Pickup могут осуществлять перевозку тяжелых грузов, поэтому онн могут обладать интерфейсом iHeavyLoadCarrier (перевозчик тяжелых грузов),

Vehicle


1 1
Compact Pickup SUV



Т

Car Train




1 1
PasMngaiTraln FralghtTrain 424DoublaBogay



L

«interface» IPaaaangaiCarrUr «Interface» IHaavyLoidCaniar


Создавая таким образом систему объектов, прежде чем начнем заниматься присущей каждому объекту спецификой, мы получаем возможность четко определить, в каких ситуациях использование абстрактных классов оказывается более предпочтительным, чем использование интерфейсов, и наоборот. Результатов, полученных в этом примере, нельзя достигнуть ни при использовании только интерфейсов, ни при использовании только абстрактного наследования.

Типы структур

В предыдущей главе мы обращали внимание на то, что структуры и классы очень похожи, хотя структуры представляют собой значимые типы, а классы — ссылочные тнпы. Что же это может означать на самом деле? Самый простой способ разобраться в этом — рассмотреть некоторый пример.
200

Глава 9

Прантикум: сравнение классов и структур

1. Создайте новое консольное приложение с именем ch09Ex03 В Директории C:\BegCSharp\Chapter9.

2. Измените код следующим образом:

namespace Ch09Ex03 (

claes МуОааа (

public int val; .

)

Struct ByStruct

{

public int val(

}

III <suramary>

III Summary description for Classl.

Ill </suiranary> class Classl С

static void Main(string[] args)

{

MyClasj obj ectA = new J(yClass (I ;

MyClaes objectВ = objectA; objectA.val - 10; objectB.val = 20;

mystruct structA - new nyStructO j mystruct structB =» etructA; structA.val =30; strecta.val >40;

Console.WriteLine('objectA.val = (Q}*, objectA.val); Console.WriteLine('objects.val - (0}', objectB.val); Console.WriteLine!'structA.val ¦ (0}', structA.val); Conaole.WriteLine('structB.vaL = (0)*, otructB.val); Console.ReadLine();

>

>

3. Запустите приложение:

’¦'• C:\HeqCS hacp \rJ] dpt ef 9 \C h0SEn03\biii '-,f> e I j С11 Г1 '?E>i Гг .4, p ni:

cibjtctfi.Uril =

'ibjBv: tB-val - Jit) з ti*aptfii .yal = ,30 St: i4ictH.ua! = 43

Presi* <mij be у to continue

Ml

Как это работает

В этом приложения содержатся два определения типов, одно из которых описывает структуру с именем mystruct, обладающую единственным общим полем типа int с именем val, а второе описывает класс с именем Myciass, который содержит аналогичное поле (мы будем рассматривать члены классов, такие как поля, в следующей главе, а пока вам достаточно знать, что синтаксис в данном случае
Определение классов______________________________________________________________________201

используется точно такой же). Далее мы выполняем одинаковые операции над экземплярами обоих типов:

? Объявляем переменную данного типа.

? Создаем новый экземпляр переменной данного типа.

? Объявляем вторую переменную данного типа.

? Присваиваем первую переменную второй переменной. .

? Присваиваем значение полю val первого экземпляра переменной.

? Присваиваем значение полю val второго экземпляра переменной.

? Выводим значение поля val обеих переменных.

Хотя мы выполняем над переменными разных типов одни и те же операции, окончательные результаты оказываются различными. При выводе значений поля vel обнаруживается, что обе переменные типа object обладают одинаковым значением, в то время как переменные типа структуры имеют различающиеся значения.

Итак, что же произошло?

Объекты — это ссылочные типы. Когда мы присваиваем объект некоторой переменной, мы на самом деле присваиваем этой переменной указатель, который ссылается на этот объект. С точки зрения программы указатель — это некий адрес в памяти. В данном случае это адрес, по которому располагается объект. Когда мы присваиваем ссылку на первый объект второй переменной типа Myciaaa, то мы, по сути, копируем этот адрес. Это означает, что обе переменных содержат ссылки на один и тот же объект.

Структуры — это значимые типы. В переменных не хранится никаких ссылок на структуру, вместо этого в них хранится сама структура. Поэтому, когда одна структура присваивается другой переменной типа mystruct, происходит копирование всей информации из одной структуры в другую. Это поведение идентично тому, которое мы наблюдали ранее для переменных простых типов, таких как тип int. Поэтому в качестве конечного результата мы получаем две переменные, содержащие разные структуры.
Предыдущая << 1 .. 92 93 94 95 96 97 < 98 > 99 100 101 102 103 104 .. 404 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.