Использование классов в C#

Прежде всего, прочитайте разд. "Kjiaccbi" теоретического введения в Java до того места, с которого начинается описание, специфическое для Java.

Как правило, классы объявляются независимо друг от друга, что позволяет использовать механизм наследования. Приведем следующий пример использования двух классов в приложении (листинг 3.3).

Листинг 3.3. Консольное приложение, работающее с двумя классами

using System; namespace Test

class Worker

public int age=O; public string name;

}

class Test {

static void Main()

{

Worker wl= new Worker();

wl.age=32;

wl.name="Petrov";

Console.WriteLine(wl.name+":"+wl.age);

Console.ReadLine();

}

}

}

Модификатор доступа public означает доступность переменных и методов данного класса из других классов. Имеются также другие модификаторы:

□      protected — переменные и методы, объявленные с этим модификатором, доступны в пределах данного класса и из всех дочерних классов;

□      private — переменные и методы с этим модификатором доступны в пределах только данного класса;

□      internai — переменные и методы данного класса доступны в пределах единицы компиляции (приложения);

□      Published — позволяет объявлять поле в окне свойств (Properties) объекта.

В C# добавлена возможность включать в классы свойства, доступные посредством методов get и put. Достаточно часто имеет место необходимость получать доступ к закрытым (private) членам класса из других классов. В C# такая возможность как раз и реализована посредством открытых свойств и методов get

И put.

В языке C# можно использовать свойства, которые позволяют получать значения полей при помощи метода get и записывать значения полей при помощи метода put. Рассмотрим следующее консольное приложение (листинг 3.4).

Листинг 3.4. Доступ к закрытым членам через свойства get/put

using System; namespace properties

/// <summary>

/// Summary description for Classl.

/// </summa ry>

public class Car:MoreCar // Наследуем свойства и поля класса

// MoreCar

/// <summary>

/// The main entry point for the application.

/ / / < / summa ry>

[STAThread]

static void Main(string[] args)

Car onecar= new Car (); // Создаем объект с помощью

// конструктора onecar.Marka="Ford"; // Заносим значение в открытое поле // Marka, которое также устанавливается в закрытом // (private) поле marka

onecar.price=120; // Этот оператор вызовет ошибку,

// поскольку совершается попытка установить значение поля // типа private в дочерних классах, что недопустимо Console.WriteLine(onecar.Marka+" "+onecar.price);

Console.ReadLine() ;

//

// TODO: Add code to start application here //

public class MoreCar

// Определяется класс с защищенными полями marka и price {

private string marka; public string Marka {

get

{

return marka;

}    // Возвращает значение приватного поля marka

set {

marka=value;

} // Устанавливает значение приватного поля marka

// через переменную value, значение которой определяется // системой

}

private int price;

}

Напомним, что поля и методы с модификатором доступа private не доступны уже в дочерних классах. Однако хорошим тоном программирования является не использование модификатора доступа public, а именно доступ к полям private посредством методов get, put для открытых свойств. Для исправления

ошибки наше приложение следует переписать как показано в листинге 3.5.

Листинг 3.5. Устранение ошибки доступа к закрытому члену класса

using System; namespace properties

/// <summary>

/// Summary description for Classl.

/// </summa ry>

public class Car:MoreCar // Наследуем свойства и поля класса

// MoreCar

/// <summary>

/// The main entry point for the application.

/ / / < / summa ry>

[STAThread]

static void Main(string[] args)

Car onecar= new Car (); // Создаем объект с помощью

// конструктора onecar.Marka="Ford"; // Заносим значение в открытое // свойство Marka, которое также устанавливается в закрытом // (private) поле marka

onecar.Price=120; // Этот оператор не вызовет ошибки Console.WriteLine(onecar.Marka+" "+onecar.Price);

Console.ReadLine();

//

// TODO: Add code to start application here //

public class MoreCar

private string marka; public string Marka {

get

{

return marka;

}

set

{

marka=value;

}

}

private int price;

public int Price // Использование открытого свойства Price {

get

{ return price;} set

{price=value;}

}

}

Открытое свойство, например, Marka, объявлено вместе с методами get и put так:

public string Marka {

get

{ return marka;} set

{marka=value; }

}

Метод get возвращает значение закрытого поля marka командой return marka; метод set устанавливает значение закрытого поля

marka оператором marka=value. Здесь value — стандартная системная переменная для установки значения свойства

Для классов используется механизм наследования. Указать в программе факт наследования можно с помощью конструкции ciassi: ciass2 (класс ciassi наследует класс ciass2). Однако родителем данного класса может быть только один класс (отличие от С++). Дочерние классы наследуют свойства и методы родителей. Приведем следующий пример (листинг 3.6).

i Листинг 3.6. Пример приложения с несколькими классами

using System; namespace Test

class Worker

public int age=0;

public void setAge(int age)

{

if ( (age>0) && (age<100)) this.age=age; else this.age=0;

}

public int getAge()

{

return this.age;

}

class Boss:Worker

public int numofworkers; public new void setAge(int age)

if((age>0)&&(age<45)) // Логическая проверка двух условий this.age=age; else this.age=0;

}

}

class Test {

static void Main()

{

Worker wl= new Worker();

Boss bl=new Boss(); wl.setAge(50);

Ы.setAge(50);

Console.WriteLine("Рабочий: "+wl.age);

Console.WriteLine("Босс: "+bl.age);

Console.ReadLine();

}

}

}

В данном приложении используются три класса. Класс Boss наследует класс worker. Это делается так:

class Boss:Worker { }

Из этого факта следует то, что в класс Boss попадают членыпеременные K.iacca • ‘ ••• •: r:

public int age=0; а также его методы:

public void setAge(int age) public int getAge()

Однако в самом классе Boss метод setAge о переопределен так:

public new void setAge(int age)

if ( (age>O)&&(age<45)) this.age=age; else this.age=O;

Метод getAge() остался без изменений. Теперь уже в методе Main() ioiaccaTest строки

wl.setAge(50);

M.setAge(50);

будут обращаться к двум различным методам.

Рассмотрим особый вид классов — интерфейсы. Интерфейс — это класс, в котором объявлены методы и свойства с методами get и put, однако реализации методов в интерфейсах отсутствуют. Класс, который наследует интерфейс, должен реализовать и методы, объявленные в интерфейсе. От интерфейса нельзя строить объекты. Интерфейс является разновидностью абстрактного класса. Абстрактный класс содержит хотя бы одно объявление метода, для которого не приведена реализация. Такие методы называются виртуальными. От абстрактного класса нельзя строить объекты. Перейдем к рассмотрению примеров интерфейсов (листинг 3.7).

Листинг 3.7. Пример приложения с использованием интерфейсов

using System;

namespace ConsoleApplicationInter

interface IParentInterfaceOne // Первый интерфейс

void ParentInterfaceOneMethod(); // Объявление метода без

// реализации

interface IMyInterfaceTwo : IParentInterfaceOne // Второй

// интерфейс наследует первый

void MethodToImplementTwo();

}

class InterfaceImplementerEx : IMyInterfaceTwo // Класс наследует интерфейс {

static void Main()

{

InterfaceImplementerEx iImp = new InterfaceImplementerEx(); Console.WriteLine("REALLY");

Console.ReadLine() ; iImp.MethodToImplementTwo(); iImp.ParentInterfaceOneMethod();

}

public void MethodToImplementTwo() // Реализация метода

// интерфейса

{

Console.WriteLine("MethodToImplementTwo() called."); string s=Console.ReadLine();

Console.WriteLine(s);

}

public void ParentInterfaceOneMethod() // Реализация метода

// интерфейса

{

Console.WriteLine("ParentInterfaceOneMethod() called."); string s=Console.ReadLine();

Console.WriteLine(s);

}

}

}

В этом примере объявлены два интерфейса: interface iparen- tInterfaceOne И interface IMyInterfaceTwo:                                                IparentInter-

faceOne. Второй из этих интерфейсов наследует первый (используется двоеточие). Это значит, что объявления методов

первого интерфейса переносятся во второй интерфейс в силу наследования. В данном приложении объявлен класс inter- faceimpiementerEx, который наследует второй интерфейс lmy- InterfaceTwo. В классе InterfaceImplementerEx как раз и необходимо реализовать методы, объявленные или унаследованные интерфейсом imyinterfaceTwo. Мы видим реализации обоих методов:

public void MethodToImplementTwo()

Console.WriteLine("MethodToImplementTwo() called."); string s=Console.ReadLine();

Console.WriteLine(s) ;

public void ParentInterfaceOneMethod()

Console.WriteLine("ParentInterfaceOneMethod() called."); string s=Console.ReadLine();

Console.WriteLine(s);

Итак, если класс наследует интерфейс, то в нем должна быть представлена реализация методов интерфейса. Рассмотрим второй пример (листинг 3.8).

Листинг 3.8. Пример с неопределенным методом get

using System;

namespace ConsoleApplicationInter interface FirstInterface // Объявлен первый интерфейс string Stroka // Объявлено открытое свойство с методом get get;

void FirstMethod(); //Объявлен метод

interface SecondInterface : FirstInterface // Объявлен второй

// интерфейс

// Он наследует метод FirstMethod() первого интерфейса {

void SecondMethod();

}

class InterfaceBased : SecondInterface // Наследование интерфейса с двумя методами и открытым // свойством Stroka {

private string str="REALLY"; static void Main()

{

InterfaceBased iImp = new InterfaceBased(); Console.WriteLine(iImp.Stroka); // Обращение к закрытому

// ПОЛЮ

// через метод get Console.ReadLine(); iImp.FirstMethod(); iImp.SecondMethod ();

}

public string Stroka // Реализация метода get {

get

{

return str;

}

}

public void FirstMethod() // Реализация метода FirstMethod()

{

Console.WriteLine("First Method() is called.");

Console.ReadLine();

public void SecondMethod() // Реализация метода SecondMethod {

Console.WriteLine("SecondMethodMethod() called.");

Console.ReadLine();

}

}

}

Реализация первого метода FirstMethod() такова: public void FirstMethod()

{

Console.WriteLine("First Method() is called.");

Console.ReadLine();

}

При запуске он объявит себя строкой:

First Method() is called

При запуске второго метода будет выведена строка:

SecondMethodMethod() called

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

Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100