Лекція Інтерфейси План icon

Лекція Інтерфейси План




Скачати 194.48 Kb.
НазваЛекція Інтерфейси План
Дата25.12.2012
Розмір194.48 Kb.
ТипЛекція

ТЕМА 2. ПАРАДИГМА ОБ’ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ

Лекція 3. Інтерфейси


План

3.1. Інтерфейс як окремий випадок абстрактного класу

3.2. Стратегії реалізації інтерфейсів у C#

3.3. Інтерфейси і поля

3.4. Інтерфейси і спадкоємство


Термін інтерфейс в програмуванні має багато різних значень, наприклад:

1. Інтерфейс користувача – засіб взаємодії користувача з програмою. Приклади – консольний інтерфейс, Windows- інтерфейс, Web- інтерфейс.

2. Інтерфейс між модулями програми – формальні і фактичні параметри методів (процедур і функцій).

3. Інтерфейс як відкрита частина класу – поля і методи з модифікатором public. Таким чином реалізується принцип інкапсуляціїї в ООП.

4. Інтерфейс як окремий випадок абстрактного класу. Саме в цьому значенні ми будемо вживати в лекції цей термін.


3.1. Інтерфейс як окремий випадок абстрактного класу


Інтерфейс це повністю абстрактний клас, всі методи якого абстрактні (не містять реалізації). Від абстрактного класу інтерфейс відрізняється деякими деталями в синтаксисі і поведінці.


^ Синтаксична відмінність полягає в тому, що методи інтерфейсу оголошуються без вказівки модифікатора доступу.


Відмінність в поведінці полягає в жорсткіших вимогах до похідних класів - в похідних класах повинні бути реалізовані всі методи інтерфейсного класу.


Це означає, що клас, який успадковує інтерфейс, зобов'язаний повністю реалізувати всі методи інтерфейсу. У цьому відмінність від класу, що успадковує абстрактний клас, де похідний клас може реалізувати лише деякі методи базового абстрактного класу.


^ Головне призначення інтерфейсів – забезпечення множинного наслідування класів.


Є ще одне важливе призначення інтерфейсів, що відрізняє їх від абстрактних класів. Абстрактний клас є початковим етапом проектування класу, який в майбутньому отримає конкретну реалізацію. Інтерфейси задають додаткові властивості класу. Один і той самий інтерфейс дозволяє описувати властивості, які можуть мати різні класи.

Кожен клас може визначати елементи інтерфейсу по-своєму. Так досягається поліморфізм: об'єкти різних класів по-різному реагують на виклики одного і того ж методу.

Синтаксис інтерфейсу аналогічний синтаксису класу:


[ атрибути ] [ специфікатори ] interface ім'я_інтерфейсу [ : предки ]

тіло_інтерфейсу [ ; ]


Для інтерфейсу можуть бути вказані специфікатори new, public, protected, internal і private. Специфікатор new застосовується для вкладених інтерфейсів і має такий самий сенс, як і відповідний модифікатор методу класу. Інші специфікатори управляють видимістю інтерфейсу. За замовчанням інтерфейс доступний лише із збірки, в якій він описаний (internal).

Інтерфейс може успадковувати методи декількох інтерфейсів, в цьому випадку предки перераховуються через кому.

Тіло інтерфейсу складають абстрактні методи, шаблони властивостей і індексаторів, а також події.

^

3.2. Стратегії реалізації інтерфейсу


Опишемо деякий інтерфейс, реалізація методів якого дозволить класу робити певні перетворення над об'єктами класу і повертати рядки, що представляють результат цих перетворень.


interface IStrings

{

///

/// Перетворення

///


/// результат перетворення

string Convert();

///

/// Шифрування

///


///
код шифру


/// результат шифрування

string Cipher(string[] code);

}


В цьому інтерфейсі є два методи, які будуть реалізувати всі класи, які будуть наслідувати цей інтерфейс. Метод Convert повинен, слідуючи алгоритму, вибраному похідним класом, перетворити об'єкт, повертаючи рядок, а метод Cipher, що повертає рядок, розглядається як шифрування, в алгоритмі якого використовується масив рядків code, переданий методу.


Загалом існує дві стратегії реалізації методів інтерфейсу: як відкритих методів і як закритих. Ми розглянемо тільки першу стратегію, яка використовується найчастіше.

Клас, що успадковує інтерфейс і реалізує його методи, може оголосити відповідні методи класу відкритими (public). У методів інтерфейсу не задані модифікатори доступу. Побудуємо приклад класу, що успадковує інтерфейс IStrings:


Приклад 3.1

///

/// Успадковує інтерфейс IStrings

/// реалізуючи його методи як відкриті (public)

///


class SimpleText : IStrings

{

//поля класу

string text;

static string[] codeTable =

{

"абвгдеёжзийклмнопрстуфхцчшщыьъэюя ,.!?;:",

"ъьыщшчцхфуэюя ,.!?;:тсрпонмлкйабвгдеёжзи"

};

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

public SimpleText()

{

text = "Простий текст!";

}

public SimpleText(string txt)

{

text = txt;

}

public string Text

{

get { return text; }

}

}

Побудований клас є звичайним класом, що містить текстове поле text, 2 конструктори, метод - властивість, що забезпечує доступ до закритого поля. Але оскільки клас оголосив себе спадкоємцем інтерфейсу IStrings, він зобов'язаний реалізувати методи інтерфейсу, запропонувавши деяку їх реалізацію. Ось приклад подібної реалізації:


/// Реалізація інтерфейсів

///

/// Видалення пробілів в полі text

/// перетворення до нижнього регістра

///


/// перетворений рядок

public string Convert()

{

string res = " ";

foreach (char sym in text)

if (sym != ' ') res += sym.ToString();

res = res.ToLower();

return res;

}

///

/// шифрування поля text

/// з використанням таблиці кодування символів

///


///
таблиця кодування


/// зашифрований текст

public string Cipher(string[] code)

{

string res = "";

foreach (char sym in text)

{

int k = code[0].IndexOf(sym);

if (k >= 0) res += code[1][k];

else res += sym.ToString();

}

return res;

}


Метод IndexOf() класу String повертає індекс першого входження вказаного символа.

Клас реалізує методи інтерфейсу, роблячи їх відкритими для клієнтів класу і спадкоємців. Клас може побудувати власні методи, використовуючи реалізацію методів інтерфейсу.


///

/// Перевірка поля text, чи є він паліндромом

/// після перетворення Convert

///


/// true, якщо паліндром

public bool IsPalindrom()

{

string txt = Convert();

for(int i=0, j = txt.Length-1; i
if(txt[i] != txt[j]) return false;

return true;

}

///

/// Шифрування, задане власною таблицею кодування

///


/// зашифрований текст

public string Coding()

{

return Cipher(codeTable);

}


Розглянемо клас Testing, методи якого дозволять виконати тестування об'єктів створюваних нами класів:


///

/// тестовий клас

///


class Testing

{

//поля класу

const string PAL =

"А роза упала на лапу Азора";

static string[] CODE =

{

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

"abvgdejziklmnoprstyfhc461w'qux"

};


///

/// Тестування класу SimpleText

///


public void TestText()

{

Console.WriteLine("Работа с объектом класу SimpleText! ");

SimpleText simpleText = new SimpleText(PAL);

Console.WriteLine("Початковий текст : " + PAL);

string text;

text = simpleText.Convert();

Console.WriteLine("Перетворений текст : " + text);

if(simpleText.IsPalindrom())

Console.WriteLine("Це паліндром!");

text = simpleText.Coding();

Console.WriteLine("Шифрований текст : " + text);


Console.WriteLine("Робота з об'єктом інтерфейсу IStrings! ");

IStrings istrings;

text = "Це простий текст!";

Console.WriteLine("Початковий текст : " + text);

simpleText = new SimpleText(text);

istrings = (IStrings)simpleText;

text = istrings.Convert();

Console.WriteLine("Перетворений текст : " + text);

text = istrings.Cipher(CODE);

Console.WriteLine("Шифрованний текст : " + text);

}

}


Зверніть увагу, що у класі Testing оголошений як об'єкт класу SimpleText, так і об'єкт istrings інтерфейсу IStrings. У методі TestText об'єкт simpleText створюється звичайним способом при виклику конструктора класу. Потім цей об'єкт викликає як відкритий метод Convert, успадкований від інтерфейсу, так і відкриті методи класу IsPalindrom, Coding, що використовують методи інтерфейсу.


^ Повний код програми:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace ConsoleInterface1

{

interface IStrings

{

string Convert();

string Cipher(string[] code);

}

///

/// Успадковує інтерфейс IStrings

/// реалізуючи його методи як відкриті (public)

///


class SimpleText : IStrings

{

//поля класу

string text;

static string[] codeTable =

{

"абвгдеёжзийклмнопрстуфхцчшщыьъэюя ,.!?;:",

"ъьыщшчцхфуэюя ,.!?;:тсрпонмлкйабвгдеёжзи"

};

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

public SimpleText()

{

text = "Простий текст!";

}

public SimpleText(string txt)

{

text = txt;

}

public string Text

{

get { return text; }

}

/// Реалізація інтерфейсів

///

/// Видалення пробілів в полі text

/// перетворення до нижнього регістра

///


/// перетворений рядок

public string Convert()

{

string res = "";

foreach (char sym in text)

if (sym != ' ') res += sym.ToString();

res = res.ToLower();

return res;

}

///

/// шифрування поля text

/// з використанням таблиці кодування символів

///


///
таблиця кодування


/// зашифрований текст

public string Cipher(string[] code)

{

string res = "";

foreach (char sym in text)

{

int k = code[0].IndexOf(sym);

if (k >= 0) res += code[1][k];

else res += sym.ToString();

}

return res;

}

///

/// Перевірка поля text, чи є він паліндромом

/// після перетворення Convert

///


/// true, якщо паліндром

public bool IsPalindrom()

{

string txt = Convert();

for (int i = 0, j = txt.Length - 1; i < j; i++, j--)

if (txt[i] != txt[j]) return false;

return true;

}

///

/// Шифрування, задане власною таблицею кодування

///


/// зашифрований текст

public string Coding()

{

return Cipher(codeTable);

}


}


class Testing

{

//поля класу

const string PAL =

"А роза упала на лапу Азора";

static string[] CODE =

{

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

"abvgdejziklmnoprstyfhc461w'qux"

};


///

/// Тестування класу SimpleText

///


public void TestText()

{

Console.WriteLine("Работа с объектом класса SimpleText! ");

SimpleText simpleText = new SimpleText(PAL);

Console.WriteLine("Початковий текст : " + PAL);

string text;

text = simpleText.Convert();

Console.WriteLine("Перетворений текст : " + text);

if (simpleText.IsPalindrom())

Console.WriteLine("Це паліндром!");

text = simpleText.Coding();

Console.WriteLine("Шифрований текст : " + text);


Console.WriteLine("Робота с об'єктом інтерфейсуа IStrings! ");

IStrings istrings;

text = "Це простий текст!";

Console.WriteLine("Початковий текст : " + text);

simpleText = new SimpleText(text);

istrings = (IStrings)simpleText;

text = istrings.Convert();

Console.WriteLine("Перетворений текст : " + text);

text = istrings.Cipher(CODE);

Console.WriteLine("Шифрований текст : " + text);

}

}

class Program

{

static void Main(string[] args)

{

Testing tint = new Testing();

tint.TestText();

Console.ReadKey();


}

}

}


Розглянемо ще один приклад. Класи Person і Student (модифікація лекції 9).


Приклад 3.2.

Створимо інтерфейсний клас з двома абстрактними методами:


interface IRating

{

void Rating(double R);

string GetRole(int Course);

}

В класі Person створимо метод GetAge()

class Person

{

public string Name; //имя

public int Age; // возраст

public string Role; // роль

public string GetName() { return Name; }

public int GetAge() { return Age; }

}

Модифікуємо клас Student. Додамо наслідування інтерфейсу IRating. В цьому класі є реалізація методів інтерфейсу IRating.


class Student : Person,IRating

{

public string Facultet;

public string Group;

public int Course;

public Student(string N, int A, string R, string F, string G, int C)

{

//конструктор з параметрами

Name = N;

Age = A;

Role = R;

Facultet = F;

Group = G;

Course = C;

}

public string GetRole(int Course)

{

if (Course <= 4)

Role = "бакалавр";

else

Role = "магістр";

return Role;

}

public void Rating(double Student_Rating)

{

if (Student_Rating >= 82)

Console.WriteLine("Привіт відмінникам");

else

if (Student_Rating <= 45)

Console.WriteLine("Перездача! Треба краще вчитися!");

else

Console.WriteLine("Можна вчитися ще краще!");

}

}


Створимо новий клас Prepod, похідний від класу Person з інтерфейсом IRating. В класі Prepod створимо власний конструктор і реалізацію методів інтерфейсу IRating.


class Prepod : Person

{

string kafedra;


public Prepod(string N, string R)

{

Name = N;

Role = R;

}


public string GetRole(int Course)

{

switch (Course)

{

case 1:

return ("Не читаю");

case 2:

return ("Matlab");

case 3:

return ("C#");

case 4:

return ("Технологія програмування");

case 5:

return ("Semantic web and XML");

case 6:

return ("Парадигми програмування");

default:

return ("Неправильно заданий курс");

}

}


public void Rating(double Prepod_Rating)

{

Console.WriteLine("Рейтинг викладача" + Prepod_Rating);

}

public string Kafedra

{

get { return kafedra; }

set

{

kafedra = value;

}

}

}


В класі Program напишемо код для перевірки роботи класів.

class Program

{

static void Main(string[] args)

{

string r;

string newRole;

//дані про студента

Student newSt = new Student("Іванов", 20, "студент", "КННІ", "K-81", 4);

Console.WriteLine("Дані про студента");

string Name = newSt.GetName();

int Age = newSt.GetAge();

Console.WriteLine("Прізвище = " + Name);

Console.WriteLine("Вік= " + Age);

newRole = newSt.GetRole(newSt.Course);

Console.WriteLine("Ви ще = " + newSt.Role);

Console.WriteLine("Факультет = " + newSt.Facultet);

Console.WriteLine("група= " + newSt.Group);

Console.WriteLine("курс= " + newSt.Course);

Console.WriteLine("Ваш рейтинг?");

r = Console.ReadLine();

double rating = Convert.ToDouble(r);

newSt.Rating(rating);

//дані про викладача

Prepod pr = new Prepod("Коротун Т.М.", "зав.кафедрою");

newRole = pr.Role;

pr.Kafedra = "КНІС"; // ініціалізація через властивість Kafedra

Console.WriteLine("Дані про викладача: " + pr.GetName());

Console.WriteLine("Посада: " + newRole);

Console.WriteLine("Кафедра: " + pr.Kafedra);

pr.Rating(100); // інтерфейсний метод

Console.WriteLine("Які дисципліни ви викладаєте?");

Console.WriteLine("На якому курсі?");

int Cource = int.Parse(Console.ReadLine());

string disc = pr.GetRole(Cource);

Console.WriteLine("на " + Cource + "курсі дисциплiну " + disc);

Console.ReadLine();

}

}


^ 3.3. Інтерфейси і поля

Ми говорили, що в інтерфейсі можна оголошувати тільки методи, а поля не можна (в явному вигляді).

Але в інтерфейсі можна оголосити властивість (шаблон властивості) з методами get і set, що забезпечують доступ до поля.

Ось приклад такого інтерфейсу:

///

/// Доступ до полів Name і Age

///


interface IFields

{

string Name { get; set; }

int Age {get;}

}

Створимо клас, що успадковує цей інтерфейс:

///

/// Клас, що успадковує інтерфейс IFields

/// Має поля Name і Age

/// доступ до поля Name відкритий клієнтам класу

/// доступ до поля Age закритий і відкритий з перейменуванням!

///


class TwoFields:IFields

{

string name;

int age;

public TwoFields()

{

name = "Nemo"; age = 37;

}

public TwoFields(string name, int age)

{

this.name = name; this.age = age;

}

public string Name

{

get { return name; }

set { name = value; }

}

int IFields.Age

{

get { return age; }

}

public int WhatAge()

{

return age;

}

}


Зверніть увагу: методи доступу до полів, успадковані від інтерфейсу, можна реалізувати як відкриті так і як закриті, відкриваючи їх потім під іншим іменем. У класу завжди має бути можливість перейменовувати імена методів і полів, успадкованих від інтерфейсу.

Додамо в клас Program в метод main код, що дозволяє протестувати роботу з успадкованими полями.


public void TestFields()

{

Console.WriteLine("Робота з об'єктом класу TwoFields!");

TwoFields twofields = new TwoFields();

Console.WriteLine("Ім'я: {0}, Вік: {1}",

twofields.Name, twofields.WhatAge());

twofields.Name = "Captain Nemo";

Console.WriteLine("Робота з інтерфейсним об'єктом IFields!");

IFields ifields = (IFields)twofields;

Console.WriteLine("Ім'я: {0}, Вік: {1}",

ifields.Name,ifields.Age);

}


^ Повний код програми.


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace Console3_Lab10

{

interface IFields

{

string Name { get; set; }

int Age { get; }

}


///

/// Клас, що успадковує інтерфейс IFields

/// Має поля Name і Age

/// доступ до поля Name відкритий клієнтам класу

/// доступ до поля Age закритий і відкритий з перейменуванням!

///


class TwoFields : IFields

{

string name;

int age;

public TwoFields()

{

name = "Nemo"; age = 37;

}

public TwoFields(string name, int age)

{

this.name = name; this.age = age;

}

public string Name

{

get { return name; }

set { name = value; }

}

int IFields.Age

{

get { return age; }

}

public int WhatAge()

{

return age;

}

}


class Program

{

static void Main(string[] args)

{

Console.WriteLine("Робота з об'єктом класу TwoFields!");

TwoFields twofields = new TwoFields();

Console.WriteLine("Ім'я: {0}, Вік: {1}",twofields.Name, twofields.WhatAge());

twofields.Name = "Captain Nemo";

Console.WriteLine("Робота з інтерфейсним об'єктом IFields!");

IFields ifields = (IFields)twofields;

Console.WriteLine("Ім'я: {0}, Вік: {1}",ifields.Name, ifields.Age);

Console.ReadLine();

}

}

}

^ 3.4. Інтерфейси і спадкоємство

Інтерфейс може не мати або мати скільки завгодно інтерфейсів-предків, в останньому випадку він успадковує всі елементи всіх своїх базових інтерфейсів, починаючи з самого верхнього рівня.

Як і в звичайній ієрархії класів, базові інтерфейси визначають загальну поведінку, а їх нащадки конкретизують і доповнюють його. У інтерфейсі-нащадку можна також вказати елементи, які перевизначають успадковані елементи з такою ж сигнатурою. В цьому випадку перед елементом вказується ключове слово new, як і в аналогічній ситуації в класах. За допомогою цього слова відповідний елемент базового інтерфейсу приховується. Клас, що реалізує інтерфейс, повинен визначати всі його елементи, у тому числі успадковані.

Інтерфейс, на власні або успадковані елементи якого є явне посилання, має бути вказаний в списку предків класу.

Клас успадковує всі методи свого предка, у тому числі ті, які реалізували інтерфейси. Він може перевизначити ці методи за допомогою специфікатора new, але звертатися до них можна буде лише через об'єкт класу. Якщо використовувати для звернення посилання на інтерфейс, викликається не перевизначена версія:


interface IBase

{

void A();

}


class Base : IBase

{

public void A() { ... }

}


class Derived: Base

{

new public void A() { ... }

}


...

Derived d = new Derived ();

d.A(); // викликається Derived.A();

IBase id = d;

id.A(); // викликається Base.A();


Проте якщо інтерфейс реалізується за допомогою віртуального методу класу, після його перевизначення в нащадку будь-який варіант звернення (через клас або через інтерфейс) призведе до одного і того самого результату.


^ Метод інтерфейсу, реалізований явною вказівкою імені, оголошувати віртуальним забороняється.


Існує можливість повторно реалізувати інтерфейс, вказавши його ім'я в списку предків класу разом з класом-предком, що вже реалізував цей інтерфейс. При цьому реалізація перевизначених методів базового класу в увагу не береться:


interface IBase

{

void A();

}


class Base : IBase

{

void IBase.A() { ... } // не використовується в Derived

}


class Derived : Base, IBase

{

public void A() { ... }

}


Якщо клас успадковує від класу і інтерфейсу, які містять методи з однаковими сигнатурами, успадкований метод класу сприймається як реалізація інтерфейсу. Взагалі при реалізації інтерфейсу враховується наявність "відповідних" методів в класі незалежно від їх походження. Це можуть бути методи, описані в поточному або базовому класі, які реалізують інтерфейс явним або неявним чином.


Висновки:

Головне призначення інтерфейсів – забезпечення множинного наслідування класів. Клас може успадковувати (реалізовувати) методи декількох інтерфейсів. Через те, що інтерфейсний клас не містить реалізації методів, то кожний клас, який успадковує інтерфейс, повинен реалізувати всі його методи. Кожен клас може визначати методи інтерфейсу по-своєму. Так досягається поліморфізм: об'єкти різних класів по-різному реагують на виклики одного і того ж методу.

Клас, що успадковує інтерфейс і реалізує його методи, може оголосити відповідні методи класу відкритими (public) чи закритими (цю стратегію реалізації ми не розглядали).

В інтерфейсі не можна оголошувати в явному вигляді поля, але можна оголосити властивість (шаблон властивості) з методами get і set, що забезпечують доступ до поля.

Інтерфейс може не мати або мати скільки завгодно інтерфейсів-предків, в останньому випадку він успадковує всі елементи всіх своїх базових інтерфейсів, починаючи з самого верхнього рівня. Як і в звичайній ієрархії класів, базові інтерфейси визначають загальну поведінку, а їх нащадки конкретизують і доповнюють його.

^

Питання і завдання для самостійної роботи студента


1. Що означає поняття "інтерфейс" як відкрита частина класу?

2. Що означає поняття "інтерфейс" як окремий випадок класу?

3. Для чого використовуються інтерфейси?

4. Опишіть синтаксис інтерфейсу. Які специфікатори доступу застосовуються в інтерфейсі?

5. У чому відміна між абстрактними класами та інтерфейсами?

6. Чи повинен клас реалізовувати всі методи всіх своїх інтерфейсів-предків?

7. Які є стратегії реалізації методів інтерфейсу? Яка стратегія розглядалася в лекції?

8. Чи може інтерфейс включати методи з реалізацією?

9. Чи може інтерфейс містити ініціалізацію полів класу?

10. Як створити новий клас, який наслідує методи і поля двох класів одночасно?

11. Що означає наступний приклад? Для чого в описі методу вказаний оператор new?

class Derived: Base

{

new public void A() { ... }

}

12. Лабораторна робота 2

Схожі:

Лекція Інтерфейси План iconЛекція Вбудовані інтерфейси С# План
У попередній лекції ми говорили, що інтерфейс це повністю абстрактний клас, всі методи якого абстрактні (не містять реалізації)
Лекція Інтерфейси План iconЛекція 10. Інтерфейси
Від абстрактного класу інтерфейс відрізняється деякими деталями в синтаксисі І поведінці
Лекція Інтерфейси План iconЛекція 11. Вбудовані інтерфейси С#
У попередній лекції ми говорили, що інтерфейс це повністю абстрактний клас, всі методи якого абстрактні (не містять реалізації)
Лекція Інтерфейси План iconНазва модуля: Програмування для систем реального часу
Програмування таймера. Сторожовий таймер. Послідовні інтерфейси. Паралельні інтерфейси. Оптимізація програмного забезпечення систем...
Лекція Інтерфейси План iconЛекція №3 Культура публічної монологічної мови План Сутність І специфіка публічної монологічної мови
Основні жанри усного публічного монологічного мовлення (доповідь, лекція, промова, виступ, повідомлення)
Лекція Інтерфейси План iconСхема аналізу лекції
Тип лекції (вступна; інформаційна (тематична); заключна (підсумкова); оглядова; нетрадиційна (наприклад, лекція-брифінг, лекція-конференція,...
Лекція Інтерфейси План iconРобочий тематичний план
Тема Історія, сучасний стан розвитку та функції посередництва в конфліктах (лекція 2 год.)
Лекція Інтерфейси План iconКалендарно-тематичний план лекцій на кафедрі офтальмології
Лекція № "Сліпота І задачі лікаря по її профілактиці. Методи дослідження функцій органа зору"
Лекція Інтерфейси План iconЛекція Політологія як наука (2 год.) План Об’єкт і предмет політології Структура політичної науки
Передумови та закономірності демократизації. Еволюція політичного режиму в незалежній Україні
Лекція Інтерфейси План iconЛекція Основні концепції, еволюція, види операційних систем. План 1 Поняття ос та її призначення
Сукупність апаратних І програмних засобів (ПЗ) складає будь-яку комп’ютерну систему
Додайте кнопку на своєму сайті:
Документи


База даних захищена авторським правом ©zavantag.com 2000-2013
При копіюванні матеріалу обов'язкове зазначення активного посилання відкритою для індексації.
звернутися до адміністрації
Документи