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

Добавление и скрытие полей потомком

Читайте также:
  1. ВАШ ДОМ ЗАКЛЮЧАЕТ В СЕБЕ МНОЖЕСТВО ПЕРЕСЕКАЮЩИХСЯ ЭНЕРГЕТИЧЕСКИХ ПОЛЕЙ
  2. Возвращение Семени для восстановления мозга; - Подъем Водяного Колеса; - Смешивание Дракона и Тигра; - Втягивание свинца и добавление ртути; - Возвращение к детству.
  3. Вопрос № 4 Вскрытие и разборка строительных конструкций зданий.
  4. Вскрытие конвертов, рассмотрение конкурсных заявок.
  5. Вскрытие урны и вынесение решения. Подведение итогов
  6. ВСКРЫТИЕ ЦИЛИНДРОВ
  7. Выбор посадок и полей допусков для сопрягаемых деталей

Модифікуємо наш клас Derived. Додамо нове поле класу debit. Також будемо вважати, що поля debit та credit повинні мати тип double, а не int. За цією причиною приховаємо батьківське поле credit, додавши власне поле з тим де ім’ям, але змінивши його тип:

 

// додання та приховування полів

protected double debit;

new protected double credit;

Щоб синтаксично підкреслити таку семантику роботи конструктора, виклик конструктора батька вбудований не в тіло конструктора, а в його заголовок. Для виклику конструктора використовується ключове слово base, яке іменує батьківський клас. Як це робиться, показано на прикладі конструкторів класу Derived:

 

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

public Derived(): base()

{

debit = 0; credit = 0;

}

public Derived(string name, double debit,

double credit)

: base(name, (int)credit)

{

this.debit = debit;

this.credit = credit;

}

 

Виклик конструктора батьківського класу з ім’ям base синтаксично слідує одразу за списком аргументів конструктора, будучи відділеним від цього списку символом двокрапки. Всі аргументи, необхідні для ініціалізації полів об’єкта, передаються конструктору нащадка. Частина з цих аргументів передається конструктору батька для ініціалізації батьківських полів.

Нащадок може створювати новий власний метод з ім’ям, відмінним від імен успадкованих методів. В такому випадку ніяких особливостей немає. Ось приклад такого метода, який створюється у класі Derived і який повертає значення, яке зберігається у прихованому полі credit:

 

// Методи

public string MyBaseCredit()

{

return base.credit.ToString();

}

 

Клас Found мав у своєму складі метод Parse. Його нащадок клас Derived розширив можливості метода, додавши перевірку до метода розбору. Оскільки батьківський метод Parse не був ні віртуальним, ні абстрактним, то новий метод Parse, доданий нащадком, приховує батьківський метод:

 

new public string Parse()

{

string res = base.Parse() + NL;

res += "Перевірка коду виконана!";

return res;

}

У класі Found визначені два віртуальних методи. Один з них — віртуальний метод VirtMethod — визначений у самому класі, другий — віртуальний метод ToString — успадкований від батьківського класу object та перевизначений у класі Found. Нащадок класу Found — клас Derived перевизначає обидва методи, дотримуючись контракту, укладеного в цьому випадку, між батьком та нащадком. При перевизначені віртуального методу зберігається ім’я методу та його сигнатура, змінюється лише реалізація:

 

public override string ToString()

{

string s = "Поля: name = {0}, Basecredit = {1}" +

"credit = {2}, debit = {3}";

return String.Format(s, name, base.credit,

credit, debit);

}

public override string VirtMethod()

{

return "Derived: " + this.ToString();

}

У класі Found визначені два не віртуальних методи NonVirtMethod та Job, успадковані нащадком Derived без перевизначень. Ви помиляєтесь, якщо вважаєте, що робота цих методів повністю визначається базовим класом Found. Поліморфізм робить їх роботу набагато цікавішою. Давайте в деталях розглянемо роботу метода Job:

 

public string Job()

{

string res = "";

res += "VirtMethod: " +

VirtMethod() + NL;

res += "NonVirtMethod: " +

NonVirtMethod() + NL;

res += "Parse: " +

Parse() + NL;

return res;

}

 

При компіляції методу Job буде виявлено, що викликаний метод VirtMethod є віртуальним, тому для нього буде застосовуватися динамічне зв’язування. Це означає, що питання про виклик методу відкладаються до моменту, коли метод Job буде викликаний об’єктом, зв’язаним з Х. Об’єкт може належати як класу Found, так і класам Derived та ChildDerived, і в залежності від класу об’єкта і буде викликаний метод цього класу.

Для методів, які викликаються (NonVirtMethod та Parse) і не є віртуальними, буде застосоване статичне зв’язування, так що метод Job завжди буде викликати методі, що належать класу Found. Але і тут не все так просто. Метод NonVirtMethod:

 

public string NonVirtMethod()

{

return "Found: " + this.ToString();

}

у процесі своєї роботи викликає віртуальний метод ToString. Знову ж таки, для метода ToString буде застосовуватись динамічне зв’язування, і в момент виконання буде визиватися метод об’єкта, а не метод посилання.

Що ж стосується метода Parse, визначеного у кожному класі, то завжди в процесі роботи Job буде викликатися тільки батьківський метод розбору через стратегії статичного зв’язування.

 

Лістинг програми:

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace _1_2

{

public partial class Form1: Form

{

Found found;

Derived derived;

protected class Found

{

// fields

protected string name;

protected int credit;

static protected int count;

const string NL = "\r\n";

// Constructors

public Found()

{

name = "Nemo";

credit = 0;

count++;

}

public Found(string name, int credit)

{

this.name = name;

this.credit = credit;

count++;

}

public override string ToString()

{

string s = "Поля: name = {0}, credit = {1}";

return String.Format(s, name, credit);

}

public string NonVirtMethod()

{

return "Found: " + this.ToString();

}

public virtual string VirtMethod()

{

return "Found: " + this.ToString();

}

public string Parse()

{

return "Розбір колу виконаний!";

}

public string Job()

{

string res = "";

res += "VirtMethod: " + VirtMethod() + NL;

res += "NonVirtMethod: " + NonVirtMethod() + NL;

res += "Parse: " + Parse() + NL;

return res;

}

public static string NumberOfObjects()

{

return "Об’єктів створено: " + count;

}

 

}

protected class Derived:Found

{

// додання та приховування полів

protected double debit;

new protected double credit;

// конструктори

public Derived(): base()

{

debit = 0; credit = 0;

}

public Derived(string name, double debit,

double credit): base(name, (int)credit)

{

this.debit = debit;

this.credit = credit;

}

// методи

public string MyBaseCredit()

{

return base.credit.ToString();

}

new public string Parse()

{

string res = base.Parse();

res += "Перевірка коду виконана!";

return res;

}

public override string ToString()

{

string s = "Поля: name = {0}, Basecredit = {1}" + "credit = {2}, debit = {3}";

return String.Format(s, name, base.credit, credit, debit);

}

public override string VirtMethod()

{

return "Derived: " + this.ToString();

}

}

public Form1()

{

InitializeComponent();

found = new Found();

derived = new Derived();

}

private void button1_Click(object sender, EventArgs e)

{

string name = textBoxFound_Name.Text;

int credit = 0;

try

{

credit = int.Parse(textBoxF_Credit.Text);

}

catch (Exception)

{

textBoxResult.Text = "Невірно задані числові дані!";

}

if (name!= "")

found = new Found(name, credit);

textBoxResult.Text = "Об’єкт класу Found успішно створений!";

 

}

private void button3_Click(object sender, EventArgs e)

{

string res = found.VirtMethod();

textBoxResult.Text = res;

}

private void button6_Click(object sender, EventArgs e)

{

string res = found.NonVirtMethod();

textBoxResult.Text = res;

}

private void button4_Click(object sender, EventArgs e)

{

string res = found.ToString();

textBoxResult.Text = res;

}

private void button7_Click(object sender, EventArgs e)

{

string res = found.Parse();

textBoxResult.Text = res;

}

private void button5_Click(object sender, EventArgs e)

{

string res = found.Job();

textBoxResult.Text = res;

}

private void button8_Click(object sender, EventArgs e)

{

string res = Found.NumberOfObjects();

textBoxResult.Text = res;

}

private void button2_Click(object sender, EventArgs e)

{

string name = textBoxD_Name.Text;

double credit = 0, debit = 0;

try

{

credit = double.Parse(textBoxD_Credit.Text);

debit = double.Parse(textBoxD_Debit.Text);

}

catch (Exception)

{

textBoxD_Result.Text = " Невірно задані числові дані!";

}

if (name!= "")

derived = new Derived(name, debit, credit);

textBoxD_Result.Text = "Об’єкт класу Derived успішно створений!";

}

private void button9_Click(object sender, EventArgs e)

{

string res = derived.VirtMethod();

textBoxD_Result.Text = res;

}

private void button12_Click(object sender, EventArgs e)

{

string res = derived.NonVirtMethod();

textBoxD_Result.Text = res;

}

private void button10_Click(object sender, EventArgs e)

{

string res = derived.ToString();

textBoxD_Result.Text = res;

}

private void button13_Click(object sender, EventArgs e)

{

string res = derived.Parse();

textBoxD_Result.Text = res;

}

private void button11_Click(object sender, EventArgs e)

{

string res = derived.Job();

textBoxD_Result.Text = res;

}

private void button14_Click(object sender, EventArgs e)

{

string res = Derived.NumberOfObjects();

textBoxD_Result.Text = res;

}

}

}

 

Лабораторна робота 1. Домашнє завдання.

Створити додаток, у якому необхідно реалізувати класи у відношеннях спадкування, показані механізми перевантаження, перевизначення та приховування батьківських методів та полів за варіантами курсової роботи.


Дата добавления: 2015-08-18; просмотров: 95 | Нарушение авторских прав


Читайте в этой же книге: Когнитивное развитие в дошкольном детстве. | Общение со сверстниками в дошкольном детстве | Развитие нравственного сознания в дошкольном детстве | Эмоциональное развитие дошкольника | Проблема готовности к обучению в школе. | Диагностика школьной зрелости. | Опишіть послідовність етапів і процедур дослідження цін. | Опишіть послідовність етапів і процедур дослідження ринку упаковки. | На основі даних про результати маркетингових досліджень охарактеризуйте вибірку: визначте одиницю вибірки, обсяг вибірки і структуру вибірки. | Лабораторна робота 1. Повторення принципів ООП. Зв’язки між класами. |
<== предыдущая страница | следующая страница ==>
Створення батьківського класу Found| Класи. Ролі класу

mybiblioteka.su - 2015-2024 год. (0.025 сек.)