Klasa implementuje kilka interfejsów z metodami o takich samych nazwach. W jaki sposób zaimplementowałbyś metody w danej klasie?


Gdy klasa implementuje interfejsy, których składowe mają metody o takich samych sygnaturach powinniśmy jawnie zaimplementować metodę dla każdego z implementowanych interfejsów.


Jako przykład posłuży nieco przesadzony przypadek, jednak dzięki temu łatwiej będzie oddać sedno problemu.

Załóżmy, że klasa Manager implementuje dwa poniższe interfejsy:

public interface IBook 
{
   void Read();
}
public interface IFile
{
   void Read();
}
public class Manager : IBook, IFile
{
    void Read()
    {
        Console.WriteLine("ReadMethod...")'
    }
}
IBook bookManager = new Manager();
IFile fileManager = new Manager();

bookManager.Read() // output: ReadMethod...
fileManager.Read() // output: ReadMethod...

Interfejsy IBook oraz IFIle oczekują dwóch różnych implementacji metody Read(). Sposób odczytu pliku jest różny od sposobu odczytu książki.

Problem ten rozwiązać można jawnie implementując daną metodę:

public interface IBook 
{
   void Read();
}
public interface IFile
{
   void Read();
}
public class Manager : IBook, IFile
{
    void IBook.Read()
    {
        Console.WriteLine("Read book...")'
    }

    void IFile.Read()
    {
        Console.WriteLine("Read file...")'
    }
}
IBook bookManager = new Manager();
IFile fileManager = new Manager();

bookManager.Read() // output: Read book...
fileManager.Read() // output: Read file...
banshee 06-09-2018 08:44
Można jeszcze nieco zmodyfikować przykład drugi, tworząc tylko jeden obiekt "manager": IBook manager = new Manager(); manager.Read(); // output: Read book... ((IFile)manager).Read(); // output: Read file...

januszgorszyciel 07-11-2018 11:16
Hehe - zrobiłbym refactor metod, a nie brnął dalej :).


© 2024 - SkillsTest.pl | | Regulamin | Polityka Prywatnosci