ГЛАВНАЯ     АРХИВ     НАПИСАТЬ АДМИНУ     ПОДПИСАТЬСЯ НА RSS     ВОЙТИ      

Поиск

Категории

Облако тегов

acer ado.net amd asp.net c sharp c# cms css exceptions google html ipad iphone it бизнес javascript jquery linq microsoft mysql net nokia nokia lumia samsung seo silverlight sql surface tsql windows 8 windows blue windows phone windows rt xna безопасность библиотека вопросы на собеседовании интересные проекты интернет интернет магазин исключения книга книги компьютерная безопасность компьютерные игры контролы курсы по программированию логированние исключений мобильные приложения монетизация сайтов наушники новости новости it новости microsoft новости интернет новости технологий ноутбук ноутбуки обработка исключений оптимизация острова периферия планшет планшеты поддержка сайтов поисковое продвижение программы продвижение продвижение сайта продвижение сайтов рабство разработка игр разработка сайтов раскрутка сайта рекламные технологии смартфон смартфоны собеседование создание сайтов средства разработки туризм фриланс хостинг яндекс
  << Предыдущий пост       Следующий пост >>  
От: ironMan
15. августа 2011 17:44

Свойства, как и методы, могут быть перегружены в производных классах. Для свойств также могут задаваться модификаторы virtual, override или abstract. Подробно о наследовании говорилось в главе «Методы», сейчас я лишь хочу еще раз привести подробный пример использования механизма виртуализации с применением свойств:



using System;

enum COLORS
{
RED,
GREEN,
BLUE
}

namespace Properties
{
abstract class Base
{
protected COLORS color;

public abstract COLORS Color
{
get;
set;
}

protected int size;
public virtual int Size
{
set
{
size - value;

/* change size of object code*/
Console.WriteLine("Изменение размера объекта {0}", value);
}
get
{
return size;
}
}
}

class Circle: Base
{
public override COLORS Color
{
get
{
return color;
}
set
{
color = value;

/* change color of the circle code */
Console.WriteLine("Изменение цвета окружности {0}", color.ToString());
}
}

private int radius,
public int Radius
{
get
{
return radius;
}
}

public override int Size
{
get
{
return size;
}
set
{
size = value;
radius = value;

/* draw circle with new size code */
Console.WriteLine("Изменение размера (радиуса) окружности {0}", value);
}
}
}

class Bar: Base
{
public override COLORS Color
{
get
{
return color;
}
set
{
color = value;

/* change bar color code */
Console.WriteLine("Изменение цвета квадрата {0} ", value.ToString() );
}
}
}
}

class PeopleApp
{
static void Main(string[] args)
{
Base baseObj;

Circle circle = new Circle!);
Bar bar = new Bar();

/* work with circle through base class */
baseObj = circle;
circle.Color = COLORS.BLUE; /* use overriding property of circle class */
circle.Size = 10; /* use overriding property of circle class */

/* work with bar through base class */
baseObj = bar;
baseObj.Color = COLORS.GREEN; /* use overriding property of bar class */
baseObj.Size = 50; /* use property of base class */
}
}

Условно говоря, данное приложение предназначено для рисования окружностей и квадратов. Для наглядности объекты могут иметь только три цвета, которые определены перечислением COLORS.



enum COLORS
{
RED,
GREEN,
BLUE
}



В качестве основы для построения объектов взят абстрактный базовый класс Base.



abstract class Base
{
protected COLORS color;
public abstract COLORS Color
{
get;
set;
}

protected int size;
public virtual int Size
{
set { ... }
get { ... }
}

...
}

Этот класс имеет два защищенных поля color и size. Для доступа к данным полям используются свойства Color и Size. Свойство Color объявлено с модификатором abstract. Это означает, что
в базовом классе нет реализации данного свойства и все производные классы обязательно должны перегрузить это свойство. О том, что свойство Color в базовом классе не имеет реализации, свидетельствуют пустые функции установщик и получатель. Свойство Size объявлено со спецификатором virtual. Это означает, что производные классы могут использовать данное свойство как в варианте базового класса, так и определить свой вариант реализации свойства. Поэтому свойство Size имеет реализацию в классе Base. Код программы содержит два производных класса от класса Base: Circle и Bar.



class Circle: Base { ... }
class Bar: Base { ... }

Поскольку класс Base является абстрактным и содержит абстрактное свойство Color, то оба производных класса обязаны реализовать у себя свойство Color. Они перегружают свойство Color, устанавливая не только значение цвета, но и реализуя код, для раскраски реальных объектов. Заметьте, что свойство Color имеет тип перечисления COLORS. Поэтому переменная value, видимая внутри метода-установщика или метода-получателя, имеет тип перечисления COLORS. О том, что мы перегружаем абстрактное свойство базового класса, свидетельствует ключевое слово override, используемое при объявлении свойств в производных классах.



public override COLORS Color

Свойство Size не является абстрактным, поэтому производные классы могут не перегружать его. Именно так и сделано в классе Ваг. Он не содержит перегруженного свойства Size. В свою очередь класс Circle содержит перегруженное свойство Size. Оно перегружено таким образом, что, кроме установки значения поля size базового класса, устанавливает значение поля radius.



public override int Size
{
get { ... }
set
{
size = value;
radius = value;

/* draw circle with new size code */
Console.WriteLine("Изменение размера (радиуса) окружности )0}", value);
}
}

Класс PeopleApp является своего рода клиентом, использующим созданные нами классы. В первой строке функции Main объявляется объект класса Base. Заметь-
те, именно объявляется, а не создается. Объект абстрактного класса создать нельзя.



Base baseObj;



Далее формируются два объекта производных классов.



Circle circle = new Circle();
Bar bar = new Bar();

Для наглядной демонстрации механизма виртуализации будем работать со свойствами производных классов через объект базового класса. Первым делом присваиваем переменной baseObj объект circle. Как уже говорилось, объект производного класса может быть приведен к типу базового класса, но не наоборот. При этом все виртуальные свойства и методы базового класса заменятся перегруженными свойствами и методами производного класса.



baseObj = circle;



Объект circle имеет тип Circle, который содержит два перегруженных свойства Color и Size. Когда мы будем устанавливать значения этих свойств, то будет происходить обращение к экземплярам свойств из производного класса.



circle.Color = COLORS.BLUE;
circle.Size = 10;

При выполнении данных строк кода на экране появится:

Изменение цвета окружности BLUE
Изменение размера (радиуса) окружности 10

После этого переменной baseObj присваивается объект bar, имеющий
тип класса Ваг.



baseObj = bar;

 

 

Теперь baseObj при обращении к свойству Color будет использовать экземпляр свойства Color класса Ваг. Со свойством Size дело обстоит иначе. Класс Ваг не имеет перегруженного экземпляра свойства Size. Поэтому, при обращении к свойству Size, обращение будет происходить к свойству базового класса.



baseObj.Color = COLORS.GREEN;
baseObj.Size = 50;



При выполнении этих строк кода на экран выведется:

Изменение цвета квадрата GREEN
Изменение размера объекта 50

( отрывок из книги В. В. Лабор "Си Шарп: Создание приложений для Windows" )

Похожие записи


Многопоточный HTTP сервер на C#
Оригинал статьи здесь: Многопоточный сервер на C# за 15 минут Автор (на хабре): ertaquo C# довольно простой и гибкий язык. Вместе с .NET поставляется довольно много уже готовых классов, что делает его еще проще. Настолько, что вполне можно написать простой многопоточный HTTP-сервер для отдачи статического содержимого всего за 15 минут. Можно было бы использовать уже...

Нейгел, Ивьен, Глинн, Уотсон, Скиннер - C# 2008 и платформа .NET 3.5
Название: C# 2008 и платформа .NET 3.5 для профессионалов Авторы: Нейгел, Ивьен, Глинн, Уотсон, Скиннер Издательство: Вильямс ISBN: 978-5-8459-1458-3 Год: 2008 Страниц: 1392 От издателя: Эта книга является совершенным руководством по языку C# 2008 и его среде. Она обновлена с учетом вышедших версий .NET 3.5 и Visual Studio 2008. Начиная с обзора и архитектуры ...

Жарков - Компьютерная графика, мультимедиа и игры на Visual C# 2005
Название: Компьютерная графика, мультимедиа и игры на Visual C# 2005 Автор: Жарков В. А. Издательство: Жарков Пресс ISBN: 5-94212-009-9 Год: 2005 г. Страниц: 812 стр От издателя: Это первая в мире книга по новейшей версии языка Visual C# 2005 из платформы Visual Studio 2005, которую издательство "Жарков Пресс" получило непосредственно от корпорации Microsoft. ...

Добавить комментарий




biuquote
  • Комментарий
  • Предпросмотр
Loading


  Сохранить комментарий