• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Interfejsy w C#*

Object Storage Arubacloud
+1 głos
231 wizyt
pytanie zadane 13 kwietnia 2022 w C# przez Nabuchadonozor Gaduła (3,120 p.)

Witam,

mam pytanko odnośnie interfejsów w programowaniu. Wszędzie gdzie czytam, znajduję przykłady zadań w tym temacie typu:

using System;
 
namespace InterfaceTest
{
    interface IKucharz
    {
        void Gotowanie();
    }
 
    class TypOsoby1:IKucharz
    {
        int Id {get;set;}
        string Imie {get;set;}
 
        public TypOsoby1(int id, string imie)
        {
            this.Id=id;
            this.Imie=imie;
        }
 
        public void Gotowanie()
        {
            Console.WriteLine (this.ToString()+" gotuje...");
        }
 
        public override string ToString()
        {
            return string.Format ("{1}",this.Id,this.Imie);
        }
    }
 
    class MainClass
    {
        public static void Main (string[] args)
        {
            TypOsoby1 adam = new TypOsoby1(1,"Adam");
            adam.Gotowanie();
        }
    }
}

czy jakieś inne, gdzie trzeba kodzić, że istnieją np. auta, z czego różne modele, z czego różne mają dodatki itd., ale czy jest ktoś w stanie mi napisać, jak to tak naprawdę może się przydać w praktyce? W pracy? Jakiś przykład, gdzie mógłbym napisać zadanie które ma sens w rzeczywistości większy, niż tylko nauka samego pracowania na tychże właśnie interfejsach?

1 odpowiedź

+1 głos
odpowiedź 14 kwietnia 2022 przez Shimeo7 Obywatel (1,910 p.)
interface ILogger {

void Log(string exception);

}

public class FileLogger : ILogger {

// todo: funkcja logowania do pliku

public void Log(string exception) { // implementacja zapisu na plik }

}



public class DbLogger : ILogger {

// todo: funkcja logowania do bazy danych

public void Log(string exception) { // implementacja zapisu na baze }

}



public class LoggerMiddleware {

private readonly ILogger _logger;

constructor(ILogger logger) {

this._logger = logger

}

// tutaj możesz manipulować w metodzie, którą utworzysz logowaniem

public void LogMessage(string message) {

this_logger.Log(message);

}
}

Przy okazji masz zachowaną zasadę O z SOLIDu.

komentarz 14 kwietnia 2022 przez Nabuchadonozor Gaduła (3,120 p.)
Znaczy się, chodzi o sytuację w której ludzie się logują, a logi tworzone są przy pomocy interfejsu, który wskazuje na danego użytkownika? Jeśli dobrze zrozumiałem, to dziękuję ślicznie, bardzo fajny przykład. Jednakże nie zamknę posta, może ktoś jeszcze się odezwie i zobaczę więcej przykładów, bardzo mi na tym zależy.
komentarz 14 kwietnia 2022 przez Wiciorny Ekspert (269,590 p.)

@Shimeo7, nie masz zachowanej zasady SOLIDU ... i to nie jest zasada, a cały zestaw konwencji i zasad. 
Jedynie w kwesti interfejsów mowa o https://web.archive.org/web/20150905081110/http://www.objectmentor.com/resources/articles/isp.pdf tylko Interface principe jest zachowany w twoim kodzie. 

1
komentarz 14 kwietnia 2022 przez Shimeo7 Obywatel (1,910 p.)

@Wiciorny,  

W odpowiedzi podałem zasada O z SOLIDu, wyciągnąłem 1 element ze zbioru...

Zasada O jest zachowana, możesz rozszerzać zachowanie LoggerMiddleware bez modyfikacji jego kodu, wszystko zależy co przyjdzie w konstruktorze. Możesz zbudować kolejną klasę np. CSVLogger (nie czepiajmy się nazewnictwa klas, bo może być lepsze niż podałem) implementującą interfejs ILogger, następnie w klasie tej napiszesz met., która loguje coś do csv. Potem z powodzeniem możesz wykorzystać ją w LoggerMiddleware, więc LoggerMiddleware nie wie, że coś się poza nią zmieniło, a możesz teraz zadziałać na 3 różne sposoby. 

W związku z powyższym wydaje mi się, że jednak jest zasada zachowana ;) ale czekam na komentarz, bo może czegoś nie widzę.

1
komentarz 14 kwietnia 2022 przez Shimeo7 Obywatel (1,910 p.)

@Nabuchadonozor, 

tutaj chodzi o logowanie na przykład wyjątków do plików, bazy, czegokolwiek , żebyś potem jako deweloper mógł sprawdzić co się stało. Tutaj user nigdzie się nie loguje.

Interfejs to taki jakby wygląd co klasa musi zawierać, sam w sobie interfejs nie definiuje np. działania metod, on tylko daje sygnaturę, obraz dla elementu go implementującego.

W elemencie tym następnie możesz zdefiniować co ma robić metoda (w naszym przypadku void Log).

Potem możesz np.

ILogger logger = new FileLogger();
logger.Log("message"); // -> logowanie do pliku
ILogger logger2 = new DbLogger();
logger2.Log("messageDB"); // -> logowanie na baze

 

komentarz 14 kwietnia 2022 przez Nabuchadonozor Gaduła (3,120 p.)
@Shimeo7,

Właśnie tego potrzebowałem, bo programując, preferuję tworzyć kod, który ma jakąkolwiek zdatność, a nie tak jak w przypadku przykładu o kucharzach czy samochodach, co mi się nie przyda. Już wiem jak zużytkować interface na własne potrzeby. (Oznaczę Twoją odpowiedź jako najlepszą, jeśli temat w przeciągu dnia, może dwóch, nie zostanie rozszerzony) Dziękuję :)

Ale tematu dalej nie zamykam, temat tak obszerny mógłby być jak dla mnie, na tyle ile jest pomysłów sensownych przykładów :))

Miłego

Podobne pytania

0 głosów
3 odpowiedzi 381 wizyt
pytanie zadane 24 sierpnia 2020 w C# przez assassin Gaduła (3,260 p.)
0 głosów
1 odpowiedź 259 wizyt
0 głosów
1 odpowiedź 438 wizyt
pytanie zadane 14 stycznia 2022 w JavaScript przez Oskar Szkurłat Bywalec (2,780 p.)

92,536 zapytań

141,377 odpowiedzi

319,452 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...