Отправляет email-рассылки с помощью сервиса Sendsay

Финансы. Инструкция

  Все выпуски  

Уроки по C# и .NET.


Информационный Канал Subscribe.Ru


C# и .NET. Уроки с сайта http://progs.biz

Рассылка №6

Основы C#. Урок 14. Вложенные классы.
Основы C#. Урок 15. Перегрузка бинарных операторов.

Полные версии уроков (с картинками) можно найти по адресам
Урок 14. Вложенные классы.
Урок 15. Перегрузка бинарных операторов.

Основы C#. Урок 14. Вложенные классы

Иногда для некоторый класс играет чисто вспомогательную роль для другого класса и используется только внутри него. В этом случае логично описать его внутри существующего класса. Вот пример такого описания:

using System;
namespace test
{
    class ClassA
    {
        //Вложенный класс
        private class ClassB
        {
            public int z;
        }
        //Переменная типа вложенного класса
        private ClassB w;
        //Конструктор
        public ClassA()
        {
            w=new ClassB();
            w.z=35;
        }
        //Некоторый метод
        public int SomeMethod()
        {
            return w.z;
        }
    }
    class Test
    {
        static void Main(string[] args)
        {
            ClassA v=new ClassA();
            int k=v.SomeMethod();
            Console.WriteLine(k);
        }
    }
}

Здесь класс ClassB объявлен внутри класса ClassA. Объявлен он со словом private, так что его экземпляры мы можем создавать только внутри класса ClassA (что мы и делаем в конструкторе класса ClassA). Методы класса ClassA имеют доступ к экземпляру класса ClassB (как, например, метод SomeMethod).

Вложенный класс имеет смысл использовать тогда, когда его экземпляр используется только в определенном классе. Кроме того, при использовании вложеных классов улучшается читаемость кода - если нас не интересует устройство основного класса, то разбирать работу вложенного класса нет необходимости.

Обратите также внимание, как вложенные классы показываются на вкладке ClassView.

Наверх

Основы C#. Урок 15. Перегрузка бинарных операторов

Перегрузка операторов - это задание для известных операторов (например, для +) новых значений. Например, мы можем перегрузить оператор + для векторов так, чтобы стало возможным использование в нашей программе конструкции вида:

...
Vector a, b, c;
 ...
c = a + b;
 ...

Здесь Vector - это введеный нами класс. Если мы не сделаем перегрузку операторов, то мы не сможем использовать знак "плюс" для экземпляров нашего класса Vector. Вот как это можно сделать для бинарного (т. е. имеющего два параметра) оператора:

using System;
namespace test
{
    class Vector
    {
        float x, y; //Координаты
        //Конструктор
        public Vector(float x, float y)
        {
            this.x=x;
            this.y=y;
        }
        //Чтение x-координаты
        public float GetX()
        {
            return x;
        }
        //Чтение y-координаты
        public float GetY()
        {
            return y;
        }
        //Перегрузка оператора +
        public static Vector operator +(Vector w, Vector v)
        {
            Vector res = new Vector(w.x + v.x, w.y + v.y);
            return res;
        }
    }
    class Test
    {
        static void Main(string[] args)
        {
            Vector a=new Vector(1, 2), b=new Vector(2, -1), c;
            c = a + b;
            Console.WriteLine("x=" + c.GetX() + ", "
            + "y=" + c.GetY());
        }
    }
}

Код для нашего класса приведен полностью, хотя перегрузка оператора занимает всего несколько строк. Вот они:

...
        public static Vector operator +(Vector w, Vector v)
        {
            Vector res = new Vector(w.x + v.x, w.y + v.y);
            return res;
        }
 ...

Синтаксис здесь такой - если мы перегружаем оператор op, то мы должны в качестве имени оператора написать operator op (в нашем случае мы перегружаем +, поэтому пишем operator +). Далее, раз это метод, то мы пишем в круглых скобках его параметры. Для бинарного оператора их два (в отдичие от C++, где пареметр - это только правый операнд, левый же передается неявно - через указатель this). У нас они оба имеют тип Vector. Перед operator op пишем тип возвращаемого значения. Так как сумма двух векторов - это опять вектор, то перед именем нашего метода пишем Vector. Модификатор доступа public понятен - без него мы бы не смогли использовать перегруженный оператор вне класса. А вот слово static важно - в C# перегруженные операторы идут как static. Не забывайте его писать.

Внутри перегруженного оператора мы заводим переменную res типа Vector для возврата через нее результата. Ее мы определяем через конструктор с двумя параметрами, который мы ранее написали для нашего класса. Сложение двух векторов происходит так, как и должно происходить - покоординатно.

В классе test мы испытываем наш перегруженный оператор. Все должно работать как и положено, и результат сложения должен вывестись на консоль в виде "x=3, y=1".

Наверх

Другие рассылки сайта progs.biz:

Рассылки Subscribe.Ru
Visual Basic. Уроки.
Уроки по Visual Basic.NET с сайта progs.biz. Написание программ, создание собственных компонентов, примеры и исходники, создание ActiveX-элементов, работа с базами данных, создание веб-приложений, FAQ, и многое другое.

Copyright Алексеев Игорь, 2002

Copyright сайт progs.biz, 2002


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное