Interfejs przekazany do metody - potrzebne propercje klasy implementującej

Interfejs przekazany do metody - potrzebne propercje klasy implementującej
S0
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 2 lata
  • Postów:9
0

Mam interfejs przekazany do metody.
Interfejs ten implementuje wiele klas, lecz w jednej z tych klas mam dodatkowe propercje.
Chciałbym użyć tych dodatkowych propercji w metodzie gdzie przekazuje interfejs.
Jak to najlepiej zrobić ?
Nie chce rozszerzać interfejsu o te propercje bo nie sa mi potrzebne w innych klasach.

FA
Propercje, brrrrr. Properties albo właściwości
FA
  • Rejestracja:około 5 lat
  • Ostatnio:mniej niż minuta
  • Lokalizacja:warszawa
  • Postów:301
1

Podaj jakis przyklad.

Dlaczego dlaczego w uniwersalne j metodzie oczekujesz konkretnej implementacji? Co sie stanie jesli jej nie otzrymasz? Jak sprawdzasz czy to dobry element? Castujesz? Jesli tak to jaki jest problem? Czy mozesz przenieść te metode do interfejsu? Czy mozesz przeniesc te metode na poziom internal? I pracowac na implementacjach?

Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
1

Jeśli nie chcesz rozszerzać interfejsu (co jest dobrą decyzją w myśl interface segregation principle) to jednym z rozwiązań może być przyjęcie że przekazywany, abstrakcyjny obiekt może wymagać dodatkowego przetwarzania. Wtedy możesz np. użyć jakiejś fabryki która- sprawdzając konkretny typ obiektu- zwróci np. jakiś obiekt przetwarzający (procesor), z kolei ten procesor będzie posiadał logikę operującą na obiekcie konkretnego typu. Z tym że to nie jest rozwiązanie idealne i zapewne da się rozwiązać Twój problem lepiej. Ciężko jednak coś więcej doradzić nie znając konkretów Twojego kodu.

Przykład:

Kopiuj
public interface ISomething
{
  string ValueOne { get; }
}

public interface ISomethingElse : ISomething
{
  string ValueTwo { get; }
}

public interface IProcessor
{
    void Process(ISomething something);
}

public class ProcessorFactory
{
  public IProcessor Create(ISomething something)
  {
     return something switch
     {
        ISomethngElse _ => new SomethingElseProcessor(),
       _ => new SomeGenericProcessor()
     };
  }
}

public class SomethingElseProcessor : IProcessor
{
  public void Process(ISomething something)
  {
    // Rzutujesz na konkretny typ. Oczywiście zakłada to żę metoda zawsze otrzyma odpowiedni obiekt, w przeciwnym razie dostaniesz tutaj wyjątek.
    var concrete = (ISomethingElse)something;
    var valueTwo = concrete.ValueTwo;
    // Wykonaj logikę konkretną dla tego typu
  }
}

public class Client
{
  public void Process(ISomething something)
  {
    var valueOne = something.ValueOne;
    // Zrób coś z valueOne

   // Stwórz instancję procesora
   var processor = _processorFactory.Create(something);
   processor.Process(something);
  }
}

Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
edytowany 1x, ostatnio: Aventus
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 dni
  • Lokalizacja:Wrocław
2

Napisz po prostu przeciążoną wersję metody przyjmującą klasę.

Aventus
Jeśli tak się da rozwiązać problem OPa to faktycznie będzie to najprostsze i najlepsze rozwiązanie :D
somekind
Ja obstawiam problem X/Y albo problem z designem, więc to raczej nie rozwiązanie tylko obejście.
JU
  • Rejestracja:około 22 lata
  • Ostatnio:około miesiąc
  • Postów:5042
1
seth01 napisał(a):

Mam interfejs przekazany do metody.
Interfejs ten implementuje wiele klas, lecz w jednej z tych klas mam dodatkowe propercje.

Powinno być "Interfejs jest implementowany przez wiele klas".
Więc przede wszystkim jest jakiś problem w samej architekturze, bo zazwyczaj takie rzeczy o tym świadczą.

Najprościej, ale zaznaczam, że nie najlepiej jest zrobić po prostu:

Kopiuj
public void Metoda(IInterfejs obj)
{
  SuperKlasa c = obj as SuperKlasa;
  if(c != null)
  {
     //i lecisz z właściwościami
  }
}

To NIE jest dobre rozwiązanie, ale najszybsze.

obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:2 dni
0
Juhas napisał(a):

Najprościej, ale zaznaczam, że nie najlepiej jest zrobić po prostu:

Kopiuj
public void Metoda(IInterfejs obj)
{
  SuperKlasa c = obj as SuperKlasa;
  if(c != null)
  {
     //i lecisz z właściwościami
  }
}

To NIE jest dobre rozwiązanie, ale najszybsze.

panią Liskov gwałcono tak często że w C# 7 jest na to nawet specjalna składnia:

Kopiuj
public void Metoda(IInterfejs obj)
{
  if(obj is SuperKlasa c)
  {
     //i lecisz z właściwościami
  }
}

ale ogólnie pomyśl nad interfejsami. Jeżeli w metodzie wymagasz tych właćiwości to może wcale nie oczekujesz interfejsu tylko konkretnej klasy? A może warto stworzyć nowy interfejs bazujący na tamtym? Musiałbyś się podzielić swoim kodem jeśli chcesz poprawne rozwiązanie.


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 dni
  • Lokalizacja:Wrocław
0
obscurity napisał(a):

panią Liskov gwałcono tak często że w C# 7 jest na to nawet specjalna składnia:

To nie jest składnia do gwałcenia dobrych zasad tylko type pattern.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)