C#   Уроки программирования с нуля. Си-шарп для чайников   C#

Здравствуйте, гость!
Вход
Регистрация


Интерфейсы в Си-шарп. Множественное наследование
Интерфейсы – это еще один инструмент реализации полиморфизма в Си-шарп. Интерфейс представляет собой набор методов (свойств, событий, индексаторов), реализацию которых должен обеспечить класс, который реализует интерфейс.

Интерфейс может содержать только сигнатуры (имя и типы параметров) своих членов. Интерфейс не может содержать конструкторы, поля, константы, статические члены. Создавать объекты интерфейса невозможно.

Объявление интерфейса

Интерфейс – это единица уровня класса, он объявляется за пределами класса, при помощи ключевого слова interface:

interface ISomeInterface
{
   // тело интерфейса
}


* Имена интерфейсам принято давать, начиная с префикса «I», чтобы сразу отличать где класс, а где интерфейс.

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

interface ISomeInterface
{
   string SomeProperty { get; set; } // свойство

   void SomeMethod(int a); // метод
}


Реализация интерфейса

Чтобы указать, что класс реализует интерфейс, необходимо, так же, как и при наследовании, после имени класса и двоеточия указать имя интерфейса:

class SomeClass : ISomeInterface // реализация интерфейса ISomeInterface
{
   // тело класса
}


Класс, который реализует интерфейс, должен предоставить реализацию всех членов интерфейса:

class SomeClass : ISomeInterface
{

   public string SomeProperty
   {
     get
     {
       // тело get аксессора
     }
     set
     {
       // тело set аксессора
     }
   }

   public void SomeMethod(int a)
   {
     // тело метода
   }
}


Пример

Есть классы геометрических фигур Прямоугольник и Окружность. У обоих классов должны быть методы вычисления периметра и площади. Эти методы мы представим интерфейсом:

interface IGeometrical // объявление интерфейса
{
   void GetPerimeter();
   void GetArea ();
}
class Rectangle : IGeometrical //реализация интерфейса
{
   public void GetPerimeter()
   {
     Console.WriteLine("(a+b)*2");
   }

   public void GetArea()
   {
     Console.WriteLine("a*b");
   }
}
class Circle : IGeometrical //реализация интерфейса
{
   public void GetPerimeter()
   {
     Console.WriteLine("2*pi*r");
   }

   public void GetArea()
   {
     Console.WriteLine("pi*r^2");
   }
}
class Program
{
   static void Main(string[] args)
   {
     List<IGeometrical> figures = new List<IGeometrical>();
     figures.Add(new Rectangle());
     figures.Add(new Circle());
     foreach (IGeometrical f in figures)
     {
       f.GetPerimeter();
       f.GetArea();
     }
     Console.ReadLine();
   }
}

В итоге, мы все так же можем объединить в один список объекты классов, которые реализуют один и тот же интерфейс.

Очень похоже на абстрактные классы

Первый вопрос, который обычно приходит в голову тем, кто изучает интерфейсы – Зачем вообще интерфейсы? Это так похоже на абстрактные классы.

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

Множественное наследование – это когда один класс сразу наследуется от нескольких классов. Но бывает так, что базовые классы содержат методы с одинаковыми именами, в результате чего возникают определенные неточности и ошибки. Множественное наследование есть в языке C++, а в C# от него отказались и внесли интерфейсы. В C# класс может реализовать сразу несколько интерфейсов. Это и является главным отличием использования интерфейсов и абстрактных классов. Кроме того, конечно же, абстрактные классы могут содержать все остальные члены, которых не может быть в интерфейсе, и не все методы/свойства в абстрактном классе должны быть абстрактными.

Если класс реализует несколько интерфейсов, они разделяются запятыми:

interface IDrawable
{
   void Draw();
}

interface IGeometrical
{
   void GetPerimeter();
   void GetArea ();
}
class Rectangle : IGeometrical, IDrawable
{
   public void GetPerimeter()
   {
       Console.WriteLine("(a+b)*2");
   }

   public void GetArea()
   {
       Console.WriteLine("a*b");
   }

   public void Draw()
   {
       Console.WriteLine("Rectangle");
   }
}
class Circle : IGeometrical, IDrawable
{

   public void GetPerimeter()
   {
     Console.WriteLine("2*pi*r");
   }

   public void GetArea()
   {
     Console.WriteLine("pi*r^2");
   }

   public void Draw()
   {
     Console.WriteLine("Circle");
  }
}

Здесь был объявлен интерфейс IDrawable, который предоставляет метод для рисования объекта. Этот интерфейс может реализовать, например, класс Image. Классы Image и Circle совсем разные сущности, и они не имеют общего базового класса, но мы можем создать список указателей на интерфейс IDrawable, и работать с такими объектами, как с однотипными (с одинаковым интерфейсом). Этот пример с IDrawable более наглядно отображает то, что нам дают интерфейсы. На практике, IGeometrical стоило бы заменить на абстрактный класс.

Домашнее задание

Создайте интерфейс ISwitchable, в котором объявите два метода – включение и выключение. Придумайте и создайте два класса, которые будут реализовать этот интерфейс.

PS. Не забываем подписываться на обновления по электронной почте в форме ниже!
Понравилась статья? Подпишись на рассылку и узнавай первым о новых уроках по почте!


Поделиться с друзьями:
25 дек 2013 01:22
Юрец 14 ноя 2016 14:24

namespace InterFeis
{
interface ISwitchable// объявляем интерфейс
{
void turnON();
void turnOFF();
}

class TV : ISwitchable//подключаем интерфейс
{
public void turnON()//реализуем метод интерфейса
{
Console.WriteLine("Телевизор включен");
}

public void turnOFF()//реализуем метод интерфейса
{
Console.WriteLine("Телевизор выключен");
}

}
class Notebook: ISwitchable// подключаем интерфейс
{
public void turnON()//реализуем метод интерфейса
{
Console.WriteLine("Ноутбук включен");
}

public void turnOFF()//реализуем метод интерфейса
{
Console.WriteLine("Ноутбук выключен");
}
}

class Program
{
static void Main(string[] args)
{
TV telek = new TV();// создаем экземпляр класса "Телевизор"
Notebook samsung = new Notebook();// создаем экземпляр класса "Ноутбук"

// вызываем переопределенные методы для каждого экземпляра
telek.turnON();
telek.turnOFF();

samsung.turnON();
samsung.turnOFF();

Console.ReadKey();
}
}
}

Игорь 27 июл 2016 00:03

interface ISwitchable
{
void SwitchOn();
void SwitchOff();
}

class TV : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Телевизор включен");
}
public void SwitchOff()
{
Console.WriteLine("Телевизор выключен");
}
}

class Iphone : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Айфон включен");
}
public void SwitchOff()
{
Console.WriteLine("Айфон выключен");
}
}


class Program
{
static void Main(string[] args)
{
List < ISwitchable > switchh= new List<ISwitchable>();
switchh.Add(new TV());
switchh.Add(new Iphone());

foreach (ISwitchable swi in switchh)
{
swi.SwitchOn();
swi.SwitchOff();
}
Console.ReadLine();
}
}
}

Степан 11 июн 2016 21:07

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Project1
{
interface ISwitchable
{
void TurnOn();
void TurnOff();
}
class Computer : ISwitchable
{
public void TurnOn()
{
Console.WriteLine("Компьютер включён!");
}
public void TurnOff()
{
Console.WriteLine("Компьютер выключен!");
}
}
class TV : ISwitchable
{
public void TurnOn()
{
Console.WriteLine("Телевизор включён!");
}
public void TurnOff()
{
Console.WriteLine("Телевизор выключен!");
}
}
class Program
{
public static void Main()
{
List<ISwitchable> switchers = new List<ISwitchable>();
switchers.Add(new Computer());
switchers.Add(new TV());
foreach (ISwitchable s in switchers)
{
s.TurnOn();
s.TurnOff();
}
Console.ReadKey();
}
}
}

Александр Михалев 17 апр 2016 08:35

interface ISwitchAble
{
void GetOn();
void GetOff();
}
class On : ISwitchAble
{
public void GetOn()
{
Console.WriteLine("Устройство включено!");
}
public void GetOff()
{
Console.WriteLine("Устройство работает");
Console.WriteLine("- - - - - - - - - - - -");
}
}
class Off : ISwitchAble
{
public void GetOff()
{
Console.WriteLine("Устройство выключено!");
}
public void GetOn()
{
Console.WriteLine("Устройство не работает");
}
}
class Program
{
static void Main(string[] args)
{
List<ISwitchAble> ISwitch = new List<ISwitchAble>();
ISwitch.Add(new On());
ISwitch.Add(new Off());

foreach(ISwitchAble f in ISwitch)
{
f.GetOn();
f.GetOff();
}
Console.ReadKey();
}
}

Михаил 08 апр 2016 16:48
Сорри, не то вставил в прошлом комментарии.

Вот код программы:


interface ISwitchable
{
void SwitchOn ();
void SwitchOff ();
}

class TV : ISwitchable
{
public void SwitchOn ()
{
Console.WriteLine ("Телевизор включен!");
}

public void SwitchOff ()
{
Console.WriteLine ("Телевизор выключен!");
}
}

class PC : ISwitchable
{
public void SwitchOn ()
{
Console.WriteLine ("Компьютер включен!");
}

public void SwitchOff ()
{
Console.WriteLine ("Компьютер выключен!");
}
}

class Example
{
static void Main(string[] args) {
List<ISwitchable> technics = new List<ISwitchable> ();

technics.Add (new TV());
technics.Add (new PC());

foreach (ISwitchable technic in technics) {
technic.SwitchOn ();
technic.SwitchOff ();
}
}
}

Михаил 08 апр 2016 16:47
Вывод:


Телевизор включен!
Телевизор выключен!
Компьютер включен!
Компьютер выключен!


Программа:


Телевизор включен!
Телевизор выключен!
Компьютер включен!
Компьютер выключен!

NewOne 30 мар 2016 19:30
Как в Main реализуется? Как Draw() применить?

interface IDrawable
{
void Draw();
}

interface IGeometrical
{
void GetPerimeter();
void GetArea ();
}
class Rectangle : IGeometrical, IDrawable
{
public void GetPerimeter()
{
Console.WriteLine("(a+b)*2");
}

public void GetArea()
{
Console.WriteLine("a*b");
}

public void Draw()
{
Console.WriteLine("Rectangle");
}
}
class Circle : IGeometrical, IDrawable
{

public void GetPerimeter()
{
Console.WriteLine("2*pi*r");
}

public void GetArea()
{
Console.WriteLine("pi*r^2");
}

public void Draw()
{
Console.WriteLine("Circle");
}
}

Akhvo 09 мар 2016 16:24
Включаем и выключаем телевизор с радиоприемником благодаря общему интерфейсу...

using System;
using System.Collections.Generic;


namespace Lesson_22
{
interface ISwitchable
{
string Name { get; set; }
void SwitchOn();
void SwitchOff();
}

class TV : ISwitchable
{
string name;

public string Name
{
get { return name; }
set { name = value; }
}

public TV()
{
Name = "телевизор";
}

public void SwitchOn()
{
Console.WriteLine("Включили " + Name);
}

public void SwitchOff()
{
Console.WriteLine("Выключили " + Name);
}
}


class Radio : ISwitchable
{
string name;

public string Name
{
get { return name; }
set { name = value; }
}

public Radio()
{
Name = "радиоприемник";
}

public void SwitchOn()
{
Console.WriteLine("Включили " + Name);
}

public void SwitchOff()
{
Console.WriteLine("Выключили " + Name);
}
}
class Program
{
static void Main(string[] args)
{
List<ISwitchable> List_rec = new List<ISwitchable>();
List_rec.Add(new TV());
List_rec.Add(new Radio());

Console.WriteLine("\nВключаем оборудование:");
Console.ReadLine();
foreach (ISwitchable rec in List_rec)
{ rec.SwitchOn(); }

Console.WriteLine("\nВыключаем оборудование:");
Console.ReadLine();
foreach (ISwitchable rec in List_rec)
{ rec.SwitchOff(); }

Console.ReadLine();
}
}
}


Abylai 08 фев 2016 15:11
Заранее спасибо, хочу сказать что уроки полезные и очень интересные. Спасибо огромное

Abylai 08 фев 2016 15:11
Заранее спасибо, хочу сказать что уроки полезные и очень интересные. Спасибо огромное

Abylai 08 фев 2016 15:08
Admin, во втором вашем примере (где вы добавили интерфейс IDrawable и метод Draw) как создать элементы массива через List
В первом примере вы написали так: List<IGeometrical> figura=new List<Geometrical>();
Но во втором примере там уже два интерфейса, куда впихнуть IDrawable
И можно ли создать и одни массив указав и то и другое?

neronovs 07 янв 2016 19:24

interface ISwitchable
{
void TurnOn();
void TurnOff();
}

class Phone : ISwitchable
{
public void TurnOff()
{
Console.WriteLine("The phone was turned off");
}

public void TurnOn()
{
Console.WriteLine("The phone was turned on");
}
}

class Tablet : ISwitchable
{
public void TurnOff()
{
Console.WriteLine("The tablet was turned off");
}

public void TurnOn()
{
Console.WriteLine("The tablet was turned on");
}
}

class Program
{
static void Main(string[] args)
{
string onoff="";

string str;
for (;;)
{
Console.WriteLine("What would you like working with: 'Phone' or 'Tablet'?");
str = Console.ReadLine();
str = str.ToLower();//change the case of letters to avoid mistakes
if (str != "phone" && str != "tablet")
Console.WriteLine("You have mistaken. Try again.");
else break;
}

Phone phone = new Phone();
Tablet tablet = new Tablet();

for (;;)
{
Console.WriteLine("To turne the device on, enter 'on', else 'off'");
onoff = Console.ReadLine();
onoff = onoff.ToLower();//change the case of letters to avoid mistakes
if (onoff == "on")
if (str == "phone")
{ phone.TurnOn(); break; }
else { tablet.TurnOn(); break; }
else if (onoff == "off")
if (str == "phone")
{ phone.TurnOff(); break; }
else { tablet.TurnOff(); break; }
else
if (str != "on" && str != "off")
Console.WriteLine("You have mistaken. Try again.");
}
Console.ReadKey();
}
}

Kolsky 31 дек 2015 12:53

using System;

namespace k
{
interface ISwitchable
{
void PowerOn();
void PowerOff();
void OnScreen();
}
class TV : ISwitchable
{
public int Power;
public TV() { }
public TV(bool b)
{
Power = b ? 1 : 0;
}
public void PowerOn()
{
Power = 1;
}
public void PowerOff()
{
Power = 0;
}
public void OnScreen()
{
Console.WriteLine(Power==1?"Телевизор включен.":"Телевизор выключен.");
}
}
class Switch : ISwitchable
{
public int Power;
public Switch() { }
public Switch(bool b)
{
Power = b ? 1 : 0;
}
public void PowerOn()
{
Power = 1;
}
public void PowerOff()
{
Power = 0;
}
public void OnScreen()
{
Console.WriteLine(Power==1?"|":"O");
}
}
class Program
{
static void Main(string[] args)
{
TV Samsung = new TV(true);
Switch BigRedButton = new Switch(false);
Switch BigRedSwitch = new Switch(true);
Samsung.OnScreen();
BigRedButton.OnScreen();
BigRedSwitch.OnScreen();
Console.ReadKey(true);
}
}
}

Максим 06 окт 2015 10:18
Виталий_Ф
---
Строки тоже объекты, и их можно создавать при помощи new. String имеет несколько конструкторов, string('-',50) этот создает строку длиной 50 символов '-'

Виталий_Ф 03 окт 2015 17:09
Не понял про множественное наследование(, точнее "неоходиости" интерфейса и разниц меж абстр классом
Залез в домашки, то же не разобрался.
в домашке Oper (от 15 фев 15г) котор Максим админ похвалил, не понял выражение "new string('-',50) вроде, в уроках его не рассматривали(

ROOT 24 авг 2015 21:40
//Домашнее задание//

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Interface
{
interface ISwitchable
{
void On();
void Off();
}
class TV : ISwitchable
{
public TV()
{ }
public void On()
{
Console.WriteLine("Телевизор включен.");
}
public void Off()
{
Console.WriteLine("Телевизор выключен.");
}
}
class Computer : ISwitchable
{
public Computer()
{}
public void On()
{
Console.WriteLine("Компьютер включен.");
}
public void Off()
{
Console.WriteLine("Компьютер выключен.");
}
}
class Program
{
public static void Error()
{
Console.ForegroundColor = ConsoleColor.Red;
Console.Clear();
Console.WriteLine("Ошибка ввода! Повторите попытку!");
Console.ReadKey();
Console.Clear();
}
public static void WorkComp()
{
Console.ForegroundColor = ConsoleColor.White;
try
{
Console.Clear();
int select;
do
{
Console.WriteLine("1 вкл\n2 выкл\n3 главное меню");
select = Convert.ToInt32(Console.ReadLine());
Console.Clear();
Computer new_comp = new Computer();
if (select == 1)
new_comp.On();
else if (select == 2)
new_comp.Off();
else if (select == 3)
MainMenu();
else
{
Error();
WorkComp();
}
}
while (select != 3);
MainMenu();
}
catch (Exception)
{
Error();
WorkComp();
}
}
public static void WorkTV()
{
Console.ForegroundColor = ConsoleColor.White;
try
{
Console.Clear();
int select;
do
{
Console.WriteLine("1 вкл\n2 выкл\n3 главное меню");
select = Convert.ToInt32(Console.ReadLine());
Console.Clear();
TV new_tv = new TV();
if (select == 1)
new_tv.On();
else if (select == 2)
new_tv.Off();
else if (select == 3)
MainMenu();
else
{
Error();
WorkTV();
}
}
while (select != 3);
MainMenu();
}
catch(Exception)
{
Error();
WorkTV();
}

}
public static void MainMenu()
{
try
{
Console.ForegroundColor = ConsoleColor.White;
Console.Clear();
Console.WriteLine("1 - работа с компьютером\n2 - работа с телевизором\n3 - выход");
int select = Convert.ToInt32(Console.ReadLine());
if (select == 1)
WorkComp();
else if (select == 2)
WorkTV();
else if (select == 3)
{
return;
}
else
{
Error();
MainMenu();
}
Console.ReadLine();
}
catch(Exception)
{
Error();
MainMenu();
}
}
static void Main(string[] args)
{
MainMenu();
}
}
}

Очень Юра 04 авг 2015 20:34
Спасибо за урок.

interface ISwitchable
{
void SwitchOn();
void SwitchOff();
}
class SenseOrgans : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Вы чувствуете, видите и слышите окружающее пространство");
}
public void SwitchOff()
{
Console.WriteLine("Вы перестаете чувствовать, видеть и слышать окружающее пространство");
}
}
class Mind : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Вы осознали, что проснулись");
}
public void SwitchOff()
{
Console.WriteLine("Ваше сознание отключается");
}
}
class Program
{
static void Main(string[] args)
{
int key;
bool issleep = false;

List<ISwitchable> persons = new List<ISwitchable>();
persons.Add(new SenseOrgans());
persons.Add(new Mind());
Console.WriteLine("Вы хотите заснуть или проснуться?");
Console.WriteLine("---------------------------------");
Console.WriteLine("1 заснуть\n2 проснуться");
Console.WriteLine("---------------------------------");
do
{
key = Convert.ToInt32(Console.ReadLine());
if (key == 1)
{
if (issleep)
Console.WriteLine("Вы и так спите!");
else
{
foreach (ISwitchable p in persons)
p.SwitchOff();
issleep = true;
}
}
else if (key == 2)
{
if (issleep)
{
foreach (ISwitchable p in persons)
p.SwitchOn();
issleep = false;
}
else
Console.WriteLine("Вы и так бодрствуете!");
}
}
while (key > 0);
}
}

AlPer 03 июл 2015 11:05
Warguss 10 июня 2015 05:59
Интерфейсы, такая удобная штука! жаль нет уроков про делегаты и события, их так не хватает в коде!!!

Полностью поддерживаю ВАС! Уважаемый Максим Ваши уроки превосходны! Спасибо Вам за Вашу работу!!!

Юлия 23 июн 2015 05:49

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
interface ISwitchable
{
void SwitchOn();
void SwitchOff();
}
class Computer : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Компьютер включен");
}
public void SwitchOff()
{
Console.WriteLine("Компьютер выключен");
}
}
class TV : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Телевизор включен");
}
public void SwitchOff()
{
Console.WriteLine("Телевизор выключен");
}
}
class Program
{
static void Main(string[] args)
{List<ISwitchable> devises=new List<ISwitchable>();
devises.Add(new TV());
devises.Add(new Computer());
foreach (ISwitchable sw in devises)
{
sw.SwitchOn();
sw.SwitchOff();
}
Console.ReadLine();
}
}
}


Flamingo 11 июн 2015 00:07
Спасибо, я немного переделал код. В итоге он стал чуть больше, но я думаю, что умение писать коротко придёт с опытом.

interface ISwitchable
{
void SwitchOn();
void SwitchOff();
}
class FlashLight : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Фонарик был включён!");
}
public void SwitchOff()
{
Console.WriteLine("Фонарик не включен!");
}
}
class Computer : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Компьютер был включён!");
}
public void SwitchOff()
{
Console.WriteLine("Компьютер не включен!");
}
}
class Program
{
static void Main(string[] args)
{
Computer computer = new Computer();
FlashLight flashlight = new FlashLight();
Console.WriteLine("Включить компьютер(ДА, НЕТ)");
string checkString = Console.ReadLine();
if (checkString == "ДА")
computer.SwitchOn();
else if (checkString == "НЕТ")
computer.SwitchOff();
else
Console.WriteLine("Некорректно введён ответ!");
Console.WriteLine("Включить фонарик(ДА, НЕТ)");
checkString = Console.ReadLine();
if (checkString == "ДА")
flashlight.SwitchOn();
else if (checkString == "НЕТ")
flashlight.SwitchOff();
else
Console.WriteLine("Некорректно введён ответ!");
}
}

Максим 10 июн 2015 14:59
Flamingo
---
Сделайте так, чтобы в коде был всего один вызов Console.ReadLine(), перед началом всяких условий

Flamingo 10 июн 2015 13:52
Максим, в коде, который я написал почему-то работает только один метод, прописанный в интерфейсе, а другой не выполняется. Можешь посмотреть в чём проблема?

interface ISwitchable
{
void SwitchOn();
void SwitchOff();
}
class FlashLight : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Фонарик был включён!");
}
public void SwitchOff()
{
Console.WriteLine("Фонарик был выключён!");
}
}
class Computer : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Компьютер был включён!");
}
public void SwitchOff()
{
Console.WriteLine("Компьютер был выключён!");
}
}
class Program
{
static void Main(string[] args)
{
Computer computer = new Computer();
FlashLight flashlight = new FlashLight();
Console.WriteLine("Включить компьютер(ДА, НЕТ)");
if (Console.ReadLine() == "ДА")
computer.SwitchOn();
else if (Console.ReadLine() == "НЕТ")
computer.SwitchOff();
Console.WriteLine("Включить фонарик(ДА, НЕТ)");
if (Console.ReadLine() == "ДА")
flashlight.SwitchOn();
else if (Console.ReadLine() == "НЕТ")
flashlight.SwitchOff();
}
}

Warguss 10 июн 2015 05:59
Интерфейсы, такая удобная штука! жаль нет уроков про делегаты и события, их так не хватает в коде!!!

Warguss 09 июн 2015 05:47

interface ISwitchable
{
void Connection();
void Shutdown();
}

class Lamp : ISwitchable
{
public void Connection()
{
Console.WriteLine("Светильник включен!");
}

public void Shutdown()
{
Console.WriteLine("Светильник выключен!");
}


}

class Printer : ISwitchable
{
public void Connection()
{
Console.Beep(200, 700);
Console.WriteLine("Принтер включен!");
}

public void Shutdown()
{
Console.Beep(1000, 670);
Console.WriteLine("Принтер выключен!");
}

}

class Program
{
static void Main()
{
ISwitchable lamp = new Lamp();
ISwitchable print = new Printer();

// Можно было бы реализовать совсем по другому, ну суть д/з создание и реализация интерфейсов
Console.WriteLine("Для включение светильника нажмите клавишу: *");
var button = Console.ReadLine();

if (button == "*")
{
lamp.Connection();
}

Console.WriteLine("для выключение светильника нажмите клавишу: #");
button = Console.ReadLine();

if(button == "#")
{
lamp.Shutdown();
}

Console.WriteLine("Для включение принтера нажмите клавишу: *");
button = Console.ReadLine();

if(button == "*")
{
print.Connection();
}

Console.WriteLine("для выключение принтера нажмите клавишу: #");
button = Console.ReadLine();

if(button == "#")
{
print.Shutdown();
}

Console.ReadKey();

}
}

Максим 17 май 2015 12:21
Максим
---
Да, обязательно нужен тип

Александр_Бугай 16 май 2015 20:09
namespace Example
{
interface ISwitchable
{
void SwitchOn();
void SwitchOff();
}
class Pc : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Input login");
for (string login = Convert.ToString(Console.ReadLine()); login != "admin"; login = Convert.ToString(Console.ReadLine()))
{
Console.WriteLine("Input login");
}
for (string password = Convert.ToString(Console.ReadLine()); password != "111"; password = Convert.ToString(Console.ReadLine()))
{
Console.WriteLine("Input Password");
}
Console.WriteLine("Welcome!");
}
public void SwitchOff()
{
Console.WriteLine("Thank you! Goog bye!");
}
}
class Car :ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Turn key");
}
public void SwitchOff()
{
Console.WriteLine("Pull off key");
}
}
class Program
{
static void Main(string[] args)
{
Pc myPc = new Pc();
Car myCar = new Car();
Console.WriteLine("If you want to manage pc - put 1. If you want to manage car - put any button");
int choose = Convert.ToInt32(Console.ReadLine());
if (choose == 1)
{
myPc.SwitchOn();
Console.WriteLine("Now we will finish");
myPc.SwitchOff();
}
else
{
Console.WriteLine("Are you ready to drive?");
string ready = Convert.ToString(Console.ReadLine());
if(ready== "yes")
{
myCar.SwitchOn();
Console.WriteLine("");
Console.WriteLine("Now we will finish");
myCar.SwitchOff();
}
}
Console.ReadLine();
}
}
}

Максим 15 май 2015 12:30
Без указания типа переменных в методах интерфейса почемуто выходят ошибки. Обязательно ли ставить тип переменной в методе интерфейса, при наследовании интерфейса?

interface ISwitchable
{
void MSwitchOn(int swt);
void MSwitchOff(int swt);
}

Максим 15 май 2015 12:25

namespace HomeWork
{
interface ISwitchable
{
void MSwitchOn(int swt);
void MSwitchOff(int swt);
}
class CTV : ISwitchable
{
public void MSwitchOn(int swt)
{
if (swt == 1)
{
Console.WriteLine("TV is On");
}
}
public void MSwitchOff(int swt)
{
if (swt == 2)
{
Console.WriteLine("TV is Off");
}
}
}
class CRadio : ISwitchable
{
public void MSwitchOn(int swt)
{
if (swt == 3)
{
Console.WriteLine("Radio is On");
}
}
public void MSwitchOff(int swt)
{
if (swt == 4)
{
Console.WriteLine("Radio is Off");
}
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("вкл/выкл ТВ клавиша \"1/2\"\nвкл/выкл Радио клавиша \"3/4\"");
int swt = Convert.ToInt32(Console.ReadLine());
List<ISwitchable> tech = new List<ISwitchable>();
tech.Add(new CTV());
tech.Add(new CRadio());
foreach(ISwitchable turn in tech)
{
turn.MSwitchOn(swt);
turn.MSwitchOff(swt);
}
Console.ReadKey();
}
}
}

phoenixpakko 28 апр 2015 11:52
Домашнее задание.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
interface ISwichable // объявление интерфейса
{
void SwitchedOn();
void SwitchedOff();
}
class TV : ISwichable //реализация интерфейса
{
public void SwitchedOn()
{
Console.WriteLine("Телевизор включен (ON)");
}
public void SwitchedOff()
{
Console.WriteLine("Телевизор выключен (OFF)");
}
}
class Computer : ISwichable //реализация интерфейса
{
public void SwitchedOn()
{
Console.WriteLine("Компьютер включен (ON)");
}
public void SwitchedOff()
{
Console.WriteLine("Компьютер выключен (OFF)");
}
}
class Program
{
static void Main(string[] args)
{
List<ISwichable> Devices = new List<ISwichable>();
Devices.Add(new TV());
Devices.Add(new Computer());
foreach (ISwichable Dev in Devices)
{
Dev.SwitchedOn();
Dev.SwitchedOff();
}
Console.ReadKey();
}
}
}


Максим 19 фев 2015 20:15
Виталий
---
Тот же пользователь Oper отлично показал для чего это нужно. Есть много приборов - телевизор, компьютер, холодильник, радио, всех их можно включить и выключить, но реализация этих методов разная(для выключения тв нажать на пульте на кнопку, или на самом тв, для компьютера alt-f4 - заверишить работу). И потом вы можете создать массив различных приборов типа ISwitchable и для каждого элемента массива (прибора) будет вызываться свой метод (с одинаковым именем) выключения. Аналогии просто достаточно абстрактные и не всё сразу понятно, но когда начнете программировать что-то полезное, не просто д/з, в некоторый момент поймете, что вам тут пригодятся интерфейсы. И эта тема близка к абстрактным классам, значит вы и их не достаточно хорошо усвоили.

Виталий 19 фев 2015 18:36
Сделал. Только вопрос: зачем нужны интерфейсы, если все равно код приходится повторять в классе-наследнике?

interface ISwitchable
{
void On();
void Off();
}
class cleaner : ISwitchable
{
bool OffOn;
public void Off()
{
OffOn = false;
Console.WriteLine("Пылесос выключен.");
}
public void On()
{
OffOn = true;
Console.WriteLine("Пылесос включен.");
}
}
class iron : ISwitchable
{
bool OffOn;
public void Off()
{
OffOn = false;
Console.WriteLine("Утюг выключен.");
}
public void On()
{
OffOn = true;
Console.WriteLine("Утюг включен.");
}
}
class Program
{
static void Main(string[] args)
{
iron iron = new iron();
cleaner cleaner = new cleaner();
iron.On();
cleaner.On();
Console.ReadKey();
}
}

Максим 19 фев 2015 14:59
Виталий
---
Немного не то, посмотри ниже, как сделал это задание Oper

Виталий 19 фев 2015 11:54
Вот такая вот простенькая, но правильная домашка.

interface ISwitchable
{
bool OffOn;
void Off;
void On;
}
class cleaner : ISwitchable
{
bool OffOn;
public void Off()
{
OffOn = false;
}
public void On()
{
OffOn = true;
}
}
class iron : ISwitchable
{
bool OffOn;
public void Off()
{
OffOn = false;
}
public void On()
{
OffOn = true;
}
}

Oper 15 фев 2015 16:20
using System;
using System.Collections.Generic;

namespace L22
{
interface ISwitchable
{
void SwitchOn();
void SwitchOff();
}

class Hotspot : ISwitchable
{
private string name;

public Hotspot(string name)
{
this.name = name;
}

public void SwitchOn()
{
Console.WriteLine("Hotpot {0} is ON", name);
}

public void SwitchOff()
{
Console.WriteLine("Hotspot {0} is OFF", name);
}
}

class Fan : ISwitchable
{
private byte number;
public Fan(byte number)
{
this.number = number;
}

public void SwitchOn()
{
Console.WriteLine("Fan №{0} is ON", number);
}

public void SwitchOff()
{
Console.WriteLine("Fan №{0} is OFF", number);
}
}

class Light : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Light is ON");
}

public void SwitchOff()
{
Console.WriteLine("Light is OFF");
}
}

class Program
{
static void Main(string[] args)
{
List<ISwitchable> devices = new List<ISwitchable>();
devices.Add(new Hotspot("Guest.Net"));
devices.Add(new Hotspot("VIP.Net"));
devices.Add(new Light());
devices.Add(new Fan(1));
devices.Add(new Fan(2));
devices.Add(new Fan(3));

Console.WriteLine("Начинаем конференцию, включем все устройства");
Console.WriteLine(new string('-',50));
foreach (ISwitchable dev in devices)
dev.SwitchOn();

Console.WriteLine("\nКонференция закончилась, выключаем все устройства");
Console.WriteLine(new string('-', 50));
foreach (ISwitchable dev in devices)
dev.SwitchOff();

Console.ReadKey();
}
}
}

AlexWolf 03 фев 2015 09:39

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
interface ISwithable
{
void on();
void off();
}
class Magnitola : ISwithable
{
public void on()
{
Console.Clear();
Console.WriteLine("Магнитола включена.");
}
public void off()
{
Console.Clear();
Console.WriteLine("Магнитола выключена.");
}
}
class TV : ISwithable
{
public void on()
{
Console.Clear();
Console.WriteLine("Телик включен.");
}
public void off()
{
Console.Clear();
Console.WriteLine("Телик выключен.");
}
}

class Program
{
static void Main(string[] args)
{
Magnitola pioneer = new Magnitola();
TV sharp = new TV();
bool IO = true;

do
{
Console.WriteLine("Используйте кнопки Q W E R для управления.");
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.Q:
pioneer.on();
break;
case ConsoleKey.W:
pioneer.off();
break;
case ConsoleKey.E:
sharp.on();
break;
case ConsoleKey.R:
sharp.off();
break;
case ConsoleKey.Escape:
IO = false;
break;
default:
Console.WriteLine("Эта кнопка не работает.");
break;
}
}
while (IO);
}
}
}


Никита 09 янв 2015 16:37
namespace bla
{
interface ISwitchable
{
void switchOn();
void switchOff();
}
class TV : ISwitchable
{
public bool Switcher { get; set; }
public string Name = "Плазма";
public void switchOn()
{
Switcher = true;
}
public void switchOff()
{
Switcher = false;
}
}
class Girl : ISwitchable
{
public bool Mouth { get; set; }
public string Name { get; set; }
public Girl(string name)
{
Name = name;
}
public void switchOn()
{
Mouth = true;
}
public void switchOff()
{
Mouth = false;
}
}
class Program
{
static void Main(string[] args)
{
Girl girl = new Girl("Катя");
TV tv = new TV();
Console.WriteLine("Сделайте выбор:\nГоловная боль - 1\nОтдых - 2");
int choice = Convert.ToInt32(Console.ReadLine());
switch (choice)
{
case 1:
girl.switchOn();
tv.switchOff();
Console.WriteLine(girl.Name+" открыла рот, "+tv.Name+" выключена");
break;
case 2:
girl.switchOff();
tv.switchOn();
Console.WriteLine(girl.Name+" закрыла рот, "+tv.Name+" включена");
break;
}
Console.ReadKey();
}
}
}

Максим 01 дек 2014 19:16
Диманиак
---
Задание простое, но зато очень хорошо показывает применение интерфейсов

Диманиак 01 дек 2014 11:42
Это задание сложно сделать по другому :)

interface ISwitchable
{
void SwitchOn();
void SwitchOff();
}
class BallpenParker : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Теперь можно писать ручкой");
}
public void SwitchOff()
{
Console.WriteLine("Теперь можно убрать ручку");
}
}
class DoorBell : ISwitchable
{
public void SwitchOn()
{
Console.WriteLine("Динь-дилинь");
}
public void SwitchOff()
{
Console.WriteLine("[снова тишина]");
}
}
class Program
{
static void Main(string[] args)
{
List<ISwitchable> things = new List<ISwitchable>();
things.Add(new BallpenParker());
things.Add(new DoorBell());
foreach (ISwitchable thing in things)
{
thing.SwitchOn();
thing.SwitchOff();
}
Console.ReadLine();
}
}
}

why_not 19 окт 2014 10:04

using System;
using System.Collections.Generic;
using System.Text;

namespace trying
{
interface ISwitchable
{
void On();
void Off();
}
class TVSet:ISwitchable
{
public void On()
{
Console.WriteLine("TVset is on");
}
public void Off()
{
Console.WriteLine("TVset is off");
}
}
class Phone:ISwitchable
{
public void On()
{
Console.WriteLine("Phone is on");
}
public void Off()
{
Console.WriteLine("Phone is off");
}
}
class Program
{

static void Main(string[] args)
{
string n;
List<ISwitchable> tech = new List<ISwitchable>();
tech.Add(new TVSet());
tech.Add(new Phone());
foreach (ISwitchable t in tech)
{
t.On();
t.Off();
}
Console.ReadKey();
}
}
}

Дмитрий 11 июн 2014 12:02
Блин, автор, как только выучу адекватно шарп и найду нормальную работу на нем - с первой зарплаты перечислю тебе на вискарь:) Очень толково и полезно!

dimasik 22 май 2014 11:45
namespace @interface
{
interface ISwitchable
{
void DeviceOn();
void DeviceOff();
}
class Washer : ISwitchable
{
public void DeviceOn()
{
Console.WriteLine("Стиральная машина включена");
}
public void DeviceOff()
{
Console.WriteLine("Стиральная машина выключена");
}
}
class Lamp : ISwitchable
{
public void DeviceOn()
{
Console.WriteLine("Лампа включена");
}
public void DeviceOff()
{
Console.WriteLine("Лампа выключена");
}
}
class Program
{
static void Main(string[] args)
{
Washer w = new Washer();
Lamp l = new Lamp();
string button = null;
Console.WriteLine("Перед тобой пульт с кнопками 1,2,3,4,exit");

while (button!="exit")
{
button = Console.ReadLine();

switch (button)
{
case "1": w.DeviceOn(); break;
case "2": w.DeviceOff(); break;
case "3": l.DeviceOn(); break;
case "4": l.DeviceOff(); break;
default: break;
}
}
Console.ReadKey();
}
}
}

Максим 12 апр 2014 21:25
GaBBo
---
Если нет необходимости их различать, просто реализуется метод и всё работает нормально. Если же нужно их отличать, тогда один метод реализуется как обычно, а другой явно:

public void foo() {
Console.WriteLine("interface1");
}
public void interface2.foo()
{
Console.WriteLine("interface2");
}

Чтобы вызвать метод второго интерфейса, необходимо объект привести к интерфейсу:
((interface2)object).foo(); // interface2

GaBBo 11 апр 2014 21:34
А что будет если в интерфейсах будут одинаковые методы?? На первый взгляд переход к интерфейсам эту проблему не решает:)

Максим 11 фев 2014 20:48
Илюфер
---
Збс

Илюфер 11 фев 2014 14:47
круто?


interface ISwitchable
{
void GetOn();

void GetOff();
}

class Lamp : ISwitchable
{
public string name = "Lamp";

public void GetOn()
{
Console.WriteLine(name + " turn on");
}

public void GetOff()
{
Console.WriteLine(name + " turn off");
}
}

class GravitationModule : ISwitchable
{
public string name = "GravitationModule";

public void GetOn()
{
Console.WriteLine(name + " turn on");
}

public void GetOff()
{
Console.WriteLine(name + " turn off");
}
}

class Action
{
public static void Main()
{
List<ISwitchable> devices = new List<ISwitchable>();
devices.Add(new Lamp());
devices.Add(new GravitationModule());

foreach (ISwitchable dev in devices)
{
dev.GetOn();
dev.GetOff();
}

Console.ReadKey();
}

}

RomanS 10 фев 2014 07:54
Спасибо. Учту.

Максим 09 фев 2014 17:39
RomanS
---
IGetPoints IShape = (IGetPoints)shape;
Console.WriteLine("This figure has {0} points", IShape.GetPoints());

Переменную можно было не создавать:

Console.WriteLine("This figure has {0} points", ((IGetPoints)shape).GetPoints());

А в целом, хороший код.

RomanS 07 фев 2014 10:42
Немного не по теме, но дайте пожалуйста общую оценку коду:
public interface IGetPoints
{
int GetPoints();
}
abstract class Shape
{
public string ShapeName { get; protected set; }
}
class Triangle : Shape, IGetPoints
{
public Triangle(string ShapeName = "Unknown triangle")
{
this.ShapeName = ShapeName;
}

public int GetPoints()
{
return 3;
}
}
class Sphere : Shape
{
public Sphere(string ShapeName = "Unknown sphere")
{
this.ShapeName = ShapeName;
}
}
public sealed class Program
{
public static void Main()
{
Shape[] MyShape = { new Triangle("My Triangle"), new Sphere() };
foreach (Shape shape in MyShape)
{
Console.WriteLine(shape.ShapeName);
if (shape is IGetPoints)
{
IGetPoints IShape = (IGetPoints)shape;
Console.WriteLine("This figure has {0} points", IShape.GetPoints());
}
else
{
Console.WriteLine("This figure has no points");
}
}
Console.ReadKey();
}
}

Максим 22 янв 2014 18:04
Ilyko
---
Это я виноват. Список должен объявляться так:
List<Iswitchable> spisok = new List<Iswitchable>();

Ilyko 22 янв 2014 18:00
Присоединяюсь к благодарностям. у меня не получается вывести список(
interface Iswitchable
{
void SwitchOn();
void SwitchOff();
}

class komnata1 : Iswitchable
{
public void SwitchOn()
{
Console.WriteLine("SwitchOn! Komnata 1");
}


public void SwitchOff()
{
Console.WriteLine("SwitchOff! Komnata 1");
}
}
class komnata2 : Iswitchable
{

public void SwitchOn()
{
Console.WriteLine("SwitchOn! Komnata 2");
}


public void SwitchOff()
{
Console.WriteLine("SwitchOff! Komnata 2");
}

}

class Program
{
static void Main(string[] args)
{
List spisok = new List(); // Вот в этой строке слово List подчеркнуто, что -то со списком не так. и выдает такую ошибку: Error 2 Using the generic type 'System.Collections.Generic.List<T>' requires 1 type arguments.

spisok.Add(new komnata1());
spisok.Add(new komnata2());


foreach (Iswitchable f in spisok)
{
f.SwitchOn();
f.SwitchOff();
}

Console.ReadKey();
}
}

Максим 09 янв 2014 20:05
Дмитрий
---
Спасибо. Да, пишу на энтузиазме...)

Дмитрий 09 янв 2014 08:50
Благодаря Вашим урокам перешёл от ядрёной смеси паскаля и си на более-менее адекватный си-шарп буквально за несколько часов!
Всё предельно просто и понятно; единственный минус - уроки появляются редко, но это можно понять, делается же всё на чистом энтузиазме.
Автор, вы очень большой молодец, спасибо за то, что Вы делаете))

Максим 31 дек 2013 23:36
Андрей
---
На консолях я учу основам языка, скоро уже перейдем на второй уровень

Андрей 31 дек 2013 19:15
Твои уроки восхитительны но перешёл бы ты с консоли на WinForm было бы круто на консоли же постоянно не удобно писать.
Сделай инструкцию как ты пишешь собственную программу постепенно рассказывая как ты её пишешь чтобы мы могли в теории всё разобрать.

Максим 26 дек 2013 13:53
Илья
---
Пожалуйста)

Илья 26 дек 2013 13:34
Круто, что уроки появляются постоянно) сам на 4, мне нравится:) спасибо...)

Максим 25 дек 2013 12:47
Антон
---
Для начала нужно добить общую теорию языка. Осталось на несколько уроков. А что дальше будет нужно подумать. Возможно создам отдельный пост, где читатели оставят свои пожелания и тогда будет ясно

Антон 25 дек 2013 05:03
Ув. автор, вопрос:
Будут ли (если да - то когда) более прикладные уроки? Скажем, рассмотрение ASP .NET, создание чего нибудь полезного.

Антон 25 дек 2013 03:24
Ура, новый урок.
Спасибо огромное)


Добавить комментарий:

Имя (обязат.)
E-mail (обязат., не публикуется)


Для вставки ваших программ пользуйтесь кнопкой "исходный код"
Вёрстка сайта с нуля

Уникальный Видеокурс!

"Научись верстать сайты и заработай на этом!"

Получить видеокурс

Подпишись на курс по программированию, и узнавай первым о новых уроках!

RSS подписка Страничка Вконтакте Мы в Twitter

Ошибка в тексте? Выделите ее мышкой и нажмите Ctrl+Enter
Поблагодарить автора: Номер карты (ПриватБанк)
5168 7572 4170 8660
WebMoney
R372544961915 U685637142028 Z999792764387
Наверх
Система Orphus