Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Ниже приведен простой пример применения модификатора доступа protected.




// Продемонстрировать применение модификатора доступа protected, using System; class В {

protected int i, j; // члены, закрытые для класса В,

// но доступные для класса D public void Set (int a, int b) { i = a; j = b;

}

public void Show() {

Console.WriteLine (i + " " + j);

}

}

class D: В {

int k; // закрытый член

// члены i и j класса В доступны для класса D public void Setk() { k = i * j;

}

public void Showk() {

Console.WriteLine(k);

}'

}

class ProtectedDemo { static void Main() {

D ob = new D ();

ob.Set(2, 3); // допустимо, поскольку доступно для класса D

ob.Show(); // допустимо, поскольку доступно для класса D ob.Setk(); // допустимо, поскольку входит в класс D ob.ShowkO; // допустимо, поскольку входит в класс D

}

}

В данном примере класс В наследуется классом D, а его члены i и j объявлены как protected, и поэтому они доступны для метода Setk (). Если бы члены i и j класса В были объявлены как private, то они оказались бы недоступными для класса D, и приведенный выше код нельзя было бы скомпилировать.

Аналогично состоянию public и private, состояние protected сохраняется за членом класса независимо от количества уровней наследования. Поэтому когда производный класс используется в качестве базового для другого производного класса, любой защищенный член исходного базового класса, наследуемый первым производным классом, наследуется как защищенный и вторым производным классом.

Несмотря на всю свою полезность, защищенный доступ пригоден далеко не для всех ситуаций. Так, в классе TwoDShape из приведенного ранее примера требовалось, чтобы значения его членов Width и Height были доступными открыто, поскольку нужно было управлять значениями, которые им присваивались, что было бы невозможно, если бы они были объявлены как protected. В данном случае более подходящим решением оказалось применение свойств, чтобы управлять доступом, а не предотвращать его. Таким образом, модификатор доступа protected следует применять в том случае, если требуется создать член класса, доступный для всей иерархии классов, но для остального кода он должен быть закрытым. А для управления доступом к значению члена класса лучше воспользоваться свойством.

Конструкторы и наследование

В иерархии классов допускается, чтобы у базовых и производных классов были свои собственные конструкторы. В связи с этим возникает следующий резонный вопрос: какой конструктор отвечает за построение объекта производного класса: конструктор базового класса, конструктор производного класса или же оба? На этот вопрос можно ответить так: конструктор базового класса конструирует базовую часть объекта, а конструктор производного класса — производную часть этого объекта. И в этом есть своя логика, поскольку базовому классу неизвестны и недоступны любые элементы производного класса, а значит, их конструирование должно происходить раздельно. В приведенных выше примерах данный вопрос не возникал, поскольку они опирались на автоматическое создание конструкторов, используемых в C# по умолчанию. Но на практике конструкторы определяются в большинстве классов. Ниже будет показано, каким образом разрешается подобная ситуация.

Если конструктор определен только в производном классе, то все происходит очень просто: конструируется объект производного класса, а базовая часть объекта автоматически конструируется его конструктором, используемым по умолчанию. В качестве примера ниже приведен переработанный вариант класса Triangle, в котором определяется конструктор, а член Style делается закрытым, так как теперь он устанавливается конструктором.

// Добавить конструктор в класс Triangle, using System;

11 Класс для двумерных объектов. •

class TwoDShape { double pri_width; double pr.i_height;

// Свойства ширины и длины объекта, public double Width {

get { return pri_width; }

set { pri_width = value < 0? -value: value; }

}

public double Height {

get { return pri_height; }

set { pri_height = value < 0? -value: value; }

}

public void ShowDim() {

Console.WriteLine("Ширина и длина равны " +

Width + " и " + Height);

}

}

// Класс для треугольников, производный от класса TwoDShape. class Triangle: TwoDShape { string Style;

// Конструктор.

public Triangle(string s, double w, double h) {

Width = w; // инициализировать член базового класса Height = h; // инициализировать член базового класса Style = s; // инициализировать член производного класса

}

// Возвратить площадь треугольника, public double Area() {

return Width * Height / 2;

}

// Показать тип треугольника, public void ShowStyle() {

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

}

}

class Shapes3 {

static void Main() {

Triangle tl = new Triangle("равнобедренный", 4.0, 4.0); Triangle t2 = new Triangle("прямоугольный", 8.0, 12.0);

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

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

Console.WriteLine ();

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

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

}

}





Поделиться с друзьями:


Дата добавления: 2016-12-03; Мы поможем в написании ваших работ!; просмотров: 381 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Что разум человека может постигнуть и во что он может поверить, того он способен достичь © Наполеон Хилл
==> читать все изречения...

2526 - | 2336 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.011 с.