Klasa abstrakcyjna w bibliotece dll ładowanej dynamicznie

0

Witam,

W moim programie poszczególne "algorytmy" mają być ładowane dynamicznie z bibliotek dll (program przeszukuje określony folder i ładuje wszytskie dll-ki spełniajace określone wymagania). Cała implementacja opera się na klasie abstrakcyjnej której większość metod jest zdefiniowana w programie głównym, natomiast zawartość danej biblioteki ma zapewnić tylko implementację metod i właściwości abstrakcyjnych.
W jaki sposób ugryźć coś takiego, bo powiem szczerze że nie bardzo mam na to pomysł ?

Zakładając że każda nowa biblioteka bazująca na tej klasie ma zapewnić implementację metod klasy abstrakcyjnej, w jaki sposób zapewnić żeby w nowym projekcie klasa potomna wiedziała jak wygląda jej klasa bazowa ? Zakłądam że w początkowym etapie klasa bazowa może się dość mocno zmieniać.

0

W projektach z bibliotekami dodaj do referencji główny program (albo nową, wydzieloną bibliotekę) ze swoją klasą abstrakcyjną.

0

Raczej nie widzę opcji żeby dodawać główną aplikacjję jako zależność. Ta opcja żeby wpakować całą klasę bazową do osobnej biblioteki wydaje sie całkiem sensowna, tylko że metody nieabstrakcyjne tej klasy są bardzo mocno uzależnione od kodu wewnątrz aplikacji głównej, jak takie coś ugryźć ?

0
W2K napisał(a):

Ta opcja żeby wpakować całą klasę bazową do osobnej biblioteki wydaje sie całkiem sensowna, tylko że metody nieabstrakcyjne tej klasy są bardzo mocno uzależnione od kodu wewnątrz aplikacji głównej, jak takie coś ugryźć ?

Zależny kod wydzielić i również przenieść do tej biblioteki.

0

Nie jest to proste, a wręcz bym powiedział niemożliwe.

Zależy mi generalnie na uzysakniu efektu że klasa bazowa ze swoich metod niebastrakcyjnych tworzy coś w stylu API którym mogą posługiwać się klasy potomne implementujące metody abstrakcyjne. Metody z klasy bazowej bardzo silnie zależą od reszty programu (wątki, zdarzenia itd). Jak to rozegrać ? Piszę swoją pierwsż aplikację z kilkoma modułami, watkami itd i troszkę zaczyna mi się to mieszać już.

0
W2K napisał(a):

Nie jest to proste, a wręcz bym powiedział niemożliwe.

To znaczy, że Twoja aplikacja jest źle napisana i słabo zaprojektowana.

Programy są jak ogry - mają warstwy. Zgodnie z dobrymi zasadami programowania, klasy z warstwy niższej nie powinny odwoływać się do klas z warstwy wyższej. Algorytmy (więc i ich klasa bazowa) to na pewno warstwa niższa niż interfejs, który jest najwyższą warstwą w programie.

Metody z klasy bazowej bardzo silnie zależą od reszty programu (wątki, zdarzenia itd).

Wątki i zdarzenia to nic złego. Obstawiam, że te metody tak naprawdę operują na GUI, i to jest problem.

Jak to rozegrać ? Piszę swoją pierwsż aplikację z kilkoma modułami, watkami itd i troszkę zaczyna mi się to mieszać już.

Trzeba odpowiednio zaprojektować aplikację, oddzielić interfejs użytkownika od wszelkiej logiki i algorytmów. Przydatne mogą być wzorce, np. Model View Presenter.

0

Akurat bezpośrednich odwołań do GUI nie ma. Tam gdzie działanie aplikacji może wymagać modyfikacji GUI jest odpowiednie zdarzenie pod które podpinam GUI. Problem polega bardziej na tym, że klasa która miałaby być przeniesiona do osobnej biblioteki jest mocno zależna od innych klas wewnętrznych. W praktyce musiałbym stworzyć osobną bibliotekę która zawiera cały "silnik" aplikacji a GUI tylko by się pod niego podpinało.

0

W praktyce musiałbym stworzyć osobną bibliotekę która zawiera cały "silnik" aplikacji a GUI tylko by się pod niego podpinało.

W praktyce tak właśnie się to robi (a przynajmniej te warstwy są rozdzielone na tyle, że bez problemu można "silnik", logikę do tej biblioteki wydzielić).

0

@W2K, jeśli nie chcesz w tej dllce umieszczać całego "silnika", to oddeleguj kod z metod protected klasy bazowej do innej klasy, której implementacja będzie gdzie Ci pasuje. Coś w ten deseń:

interace IProtectedMethodsHelper
{
    public void A();
    public void B();
}

abstract class MyBaseClass
{
    private IProtectedMethodsHelper _helper;

    public MyBaseClass(IProtectedMethodsHelper helper)
    {
         _helper = helper;
    }

    public abstract void X();
    public abstract void Y();

    protected void A()
    {
        _helper.A();
    }

    protected void B()
    {
        _helper.B();
    }
}

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