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

Interfejsy w C#*

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
+1 głos
97 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 (251,410 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 306 wizyt
pytanie zadane 24 sierpnia 2020 w C# przez assassin Gaduła (3,260 p.)
0 głosów
1 odpowiedź 80 wizyt
0 głosów
1 odpowiedź 99 wizyt
pytanie zadane 14 stycznia 2022 w JavaScript przez Oskar Szkurłat Bywalec (2,730 p.)

90,816 zapytań

139,494 odpowiedzi

313,557 komentarzy

60,313 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...