KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Герберт Шилдт - C# 4.0: полное руководство

Герберт Шилдт - C# 4.0: полное руководство

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Герберт Шилдт, "C# 4.0: полное руководство" бесплатно, без регистрации.
Перейти на страницу:

  public Triangle(double x) : base(x) {

    Style = "равнобедренный";

  }


  // Возвратить площадь треугольника,

  public double Area() {

    return Width * Height / 2;

  }


  // Показать тип треугольника,

  public void ShowStyle() {

    Console.WriteLine("Треугольник " + Style);

  }

}


class Shapes5 {

  static void Main() {

    Triangle t1 = new Triangle();

    Triangle t2 = new Triangle("прямоугольный", 8.0, 12.0);

    Triangle t3 = new Triangle(4.0);


    t1 = t2;


    Console.WriteLine("Сведения об объекте t1: ");

    t1.ShowStyle();

    t1.ShowDim();

    Console.WriteLine("Площадь равна " + t1.Area());

    Console.WriteLine();


    Console.WriteLine("Сведения об объекте t2: ");

    t2.ShowStyle();

    t2.ShowDim();

    Console.WriteLine("Площадь равна " + t2.Area());

    Console.WriteLine();


    Console.WriteLine("Сведения об объекте t3: ");

    t3.ShowStyle();

    t3.ShowDim();

    Console.WriteLine("Площадь равна " + t3.Area());

    Console.WriteLine();

  }

}


Вот к какому результату приводит выполнение этого кода.


Сведения об объекте t1:

Треугольник прямоугольный

Ширина и высота равны 8 и 12

Площадь равна 48


Сведения об объекте t2:

Треугольник прямоугольный

Ширина и высота равны 8 и 12

Площадь равна 48


Сведения об объекте t3:

Треугольник равнобедренный

Ширина и высота равны 4 и 4

Площадь равна 8


А теперь рассмотрим вкратце основные принципы действия ключевого слова base. Когда в производном классе указывается ключевое слово base, вызывается конструктор из его непосредственного базового класса. Следовательно, ключевое слово base всегда обращается к базовому классу, стоящему в иерархии непосредственно над вызывающим классом. Это справедливо даже для многоуровневой иерархии классов. Аргументы передаются базовому конструктору в качестве аргументов метода base(). Если же ключевое слово отсутствует, то автоматически вызывается конструктор, используемый в базовом классе по умолчанию.


Наследование и сокрытие имен

В производном классе можно определить член с таким же именем, как и у члена его базового класса. В этом случае член базового класса скрывается в производном классе. И хотя формально в C# это не считается ошибкой, компилятор все же выдаст сообщение, предупреждающее о том, что имя скрывается. Если член базового класса требуется скрыть намеренно, то перед его именем следует указать ключевое слово new, чтобы избежать появления подобного предупреждающего сообщения. Следует,

однако, иметь в виду, что это совершенно отдельное применение ключевого слова new, не похожее на его применение при создании экземпляра объекта.

Ниже приведен пример сокрытия имени.

// Пример сокрытия имени с наследственной связью.

using System;

class А {

public int i = 0;

}

// Создать производный класс.    j

class В : A {    *

new int i; // этот член скрывает член i из класса А public В(int b) {

i = b; // член i в классе В

}

public void Show()    {

Console.WriteLine("Член i в производном классе: " + i) ;

}

}

class NameHiding { static void Main() {

В ob = new В(2);

ob.Show() ;

}

}

Прежде всего обратите внимание на использование ключевого слова new в следующей строке кода.

new int i; // этот член скрывает член i из класса А

В этой строке компилятору, по существу, сообщается о том, что вновь создаваемая переменная i намеренно скрывает переменную i из базового класса А и что автору программы об этом известно. Если же опустить ключевое слово new в этой строке кода, то компилятор выдаст предупреждающее сообщение.

Вот к какому результату приводит выполнение приведенного выше кода.

Член i в производном классе: 2

В классе В определяется собственная переменная экземпляра i, которая скрывает переменную i из базового класса А. Поэтому при вызове метода Show() для объекта типа В выводится значение переменной i, определенной в классе В, а не той, что определена в классе А.


Применение ключевого слова base для доступа к скрытому имени

Имеется еще одна форма ключевого слова base, которая действует подобно ключевому слову this, за исключением того, что она всегда ссылается на базовый класс в том производном классе, в котором она используется. Ниже эта форма приведена в общем виде:


base.член


где член может обозначать метод или переменную экземпляра. Эта форма ключевого слова base чаще всего применяется в тех случаях, когда под именами членов производного класса скрываются члены базового класса с теми же самыми именами. В качестве примера ниже приведен другой вариант иерархии классов из предыдущего примера.


// Применение ключевого слова base для преодоления

// препятствия, связанного с сокрытием имен.

using System;

class А {

  public int i = 0;

}


// Ссзздать производный класс,

class В : А {

  new int i; // этот член скрывает член i из класса А


  public В(int a, int b) {

    base.i = a; // здесь обнаруживается скрытый член из  класса А

    i = b; // член i из класса В

  }


  public void Show()    {

    // Здесь выводится член i из класса А.

    Console.WriteLine("Член i в базовом классе:    "    +    base.i);


    // А здесь выводится член i из класса В.

    Console.WriteLine("Член i в производном классе: " + i);

  }

}


class UncoverName {

  static void Main() {

    В ob = new В(1, 2);

    ob.Show();

  }

}


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


Член i в базовом классе: 1

Член i в производном классе: 2


Несмотря на то что переменная экземпляра i в производном классе В скрывает переменную i из базового класса А, ключевое слово base разрешает доступ к переменной i, определенной в базовом классе.

С помощью ключевого слова base могут также вызываться скрытые методы. Например, в приведенном ниже коде класс В наследует класс А и в обоих классах объявляется метод Show(). А затем в методе Show() класса В с помощью ключевого слова base вызывается вариант метода Show(), определенный в классе А.


// Вызвать скрытый метод.

using System;

class А {

  public int i = 0;


  // Метод Show() в классе A

  public void Show() {

    Console.WriteLine("Член i в базовом классе: " + i);

  }

}


// Создать производный класс,

class В : А {

  new int i; // этот член скрывает член i из класса А


  public В(int a, int b) {

    base.i = a; // здесь обнаруживается скрытый член из класса А

    i = b; // член i из класса В

  }


  // Здесь скрывается метод Show() из класса А. Обратите

  // внимание на применение ключевого слова new.

  new public void Show() {

    base.Show(); // здесь вызывается метод Show() из класса А

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*