Idea interfejsów

0

Chciałbym, żebyście mi napisali czy dobrze rozumiem idee interfejsów w C#.
Chodzi o to, że interfejs jest to po prostu jakby zbiór abstrakcyjnych składowych i jeżeli jakaś klasa go "dziedziczy" to musi zaimplementować jego metody.

Np:
Interfejs figura:

using System;

namespace Interfejsy_zabawa
{
    interface IFigura
    {
        void ksztalt();
        void rysuj();
    }

    interface IPunkty
    {
        byte SetPoints { get; }
    }
}
 

Klasa prostokąt:

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

namespace Interfejsy_zabawa
{
    class Prostokat : IFigura
    {
        public void ksztalt()
        {
            Console.Write("Jestem prostokatem...");
        }

        public void rysuj()
        {
            Console.WriteLine("Rysuje prostokat...");
        }

  
    }
}

Klasa trójkąt:

 using System;

namespace Interfejsy_zabawa
{
    class Trojkat : IFigura, IPunkty
    {
        public void ksztalt()
        {
            Console.WriteLine("Jestem trójkątem...");
        }

        public void rysuj()
        {
            Console.WriteLine("Rysuję trójkąt...");
        }
        public byte SetPoints
        {
            get
            {
                return 3;
            }
        }
    }
}

Program:

using System;

namespace Interfejsy_zabawa
{
    class Program
    {
        static void Main(string[] args)
        {
            Prostokat p1 = new Prostokat();
            p1.ksztalt();
            p1.rysuj();
            Console.WriteLine();

            Trojkat t1 = new Trojkat();
            t1.ksztalt();
            t1.rysuj();

            IPunkty pt2 = t1 as IPunkty;
            IPunkty pt3 = p1 as IPunkty;

            if (pt2 != null)
                Console.WriteLine("Punkty: {0} ", pt2.SetPoints);
            if (pt3 != null)
                Console.WriteLine("Punkty: {0} ", pt2.SetPoints);
            else
                Console.WriteLine("Ten kształt nie posiada interfejsu IPunkty");

            Console.ReadKey();
        }
    }
}
 

Jednak dalej nie rozumiem po co używać akurat interfejsów, skoro mogę używać abstrakcyjnych klas? Czym się to różni?

1
MVC napisał(a):

Chciałbym, żebyście mi napisali czy dobrze rozumiem idee interfejsów w C#.

Idea interfejsów jest niezależna od języka. ;)

Jednak dalej nie rozumiem po co używać akurat interfejsów, skoro mogę używać abstrakcyjnych klas? Czym się to różni?

Bo klasa może dziedziczyć tylko z jednej klasy bazowej, ale może implementować wiele interfejsów.

0

@somekind
czyli jeżeli w trakcie projektowania programu będziemy wiedzieli, że różne klasy będą musiały mieć identyczne składowe jednak o innej implementacji to wtedy robimy interfejs tak?
Możesz pokazać jakiś większy przykład zastosowania?

2

Nie składowe, tylko zachowania - bo interfejsy opisują zachowania.
Dzięki nim kod staje się bardziej uniwersalny - możesz raz napisać metodę, która przyjmie argument typu jakiegoś interfejsu i będzie korzystała z jego funkcjonalności, to potem będziesz mógł wywołać tę metodę przekazując jej interfejs dowolnej klasy zgodnej z tym interfejsem, bez względu na to, co to za klasa, kto ją napisał, ani z jakiej klasy dziedziczy.

0

Stosuje się jeszcze tzw. interfejsy znacznikowe. Są one "puste" tj. nie posiadają żadnych metod. Służą do "oznaczenia" że obiekt danej klasy należy do konkretnego typu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1