Dziedziczenie klass i ukrywanie klasy dziedziczonej poza dll

0

Witam,
Nie umiem znaleźć rozwiązania swojego problemu. Otóż mam bibliotekę (nazwijmy ją Logic.dll) z której korzysta program. W Bibliotece chcę utworzyć klasę bazową z której korzystać będą inne klasy. Mniej więcej wyglądałoby to tak

public class PostBase
    {
        protected IPost GetPost(int postId)
        {
            IPost model = new Model.Post();
            model.Identyfikator = 1;
            model.Tresc = "Test posta";
            return model;
        }

        protected List<IPost> GetPosts(int topicId, int offset, int limit)
        {
            List<IPost> result = new List<IPost>();
            for(int i = 0; i < 5; i++)
            {
                IPost item = new Model.Post();
                item.Identyfikator = i + 1;
                item.Tresc = string.Format("Test posta {0}", item.Identyfikator);
            }

            return result;
        }
    }

I przykład klasy dziedziczącej

public class Post : PostBase
    {
        public IPost GetPost(int postId)
        {
            return base.GetPost(postId);
        }
    } 

Nie wiem czy moje podejście do problemu jest dobre czy może powinienem rozwiązać go inaczej jednak nie o to tu chodzi. Pomijając fakt czy metody zostaną protected czy zmienie je na virtual mam problem, że klasa PostBase musi być publiczna aby mogła być dziedziczona z klasy Post ale wtedy jest widoczna poza biblioteką czyli w programie. I wtedy mogę utworzyć instancję klasy, która nic nie robi... Mogę w jakiś sposób ukryć tę klasę?

1

C# pozwala na dziedziczenie tylko z klas publicznych.

0

Yhm, rozumiem ale czy ktoś jest w stanie podpowiedzieć czy taką klasę, która nie jest abstrakcyjna ale służy tylko do dziedziczenia można uchronić chociaż przed tworzeniem instancji?

0

C# pozwala na dziedziczenie tylko z klas publicznych.

to jest oczywista nieprawda, ale równie oczywiste jest, że do klasy po której chcemy dziedziczyć musimy mieć dostęp - czyli nie może być to klasa prywatna w innej bibliotece.

Mogę w jakiś sposób ukryć tę klasę?

możesz umieścić obie klasy w tym samym exeku albo bibliotece.

nie da się tak, żeby klasa była jednocześnie dostępna i niedostępna z zewnątrz.

ale czy ktoś jest w stanie podpowiedzieć czy taką klasę, która nie jest abstrakcyjna ale służy tylko do dziedziczenia można uchronić chociaż przed tworzeniem instancji?

a po co? jak ktoś chce sobie kuku zrobić...?

0

Ale obie klasy są w jednej dll'ce... Tylko, że chcę z klasy pochodnej korzystać poza dll'ką czyli:

  • obie klasy są w jednej dll'ce tylko, że klasa bazowa ma być używana wyłącznie przez inne klasy wewnątrz dll'ki
  • klasy korzystające z klasy bazowej np klasa Post : PostBase ma być widoczna poza dll'ką. Będą one rozszerzane o inne metody.
    W chwili obecnej dziedziczne zachodzi ale obie klasy widzę poza dll'ką czyli w programie. Czyli mam możliwość utworzenia instancji klasy PostBase, która nic nie robi...
0

W Bibliotece chcę utworzyć klasę bazową z której korzystać będą inne klasy

  • a masz zamiar tworzyć instancje superklasy? Bo jeśli nie, to możesz ją po prostu oznaczyć jako abstrakcyjną i protected (aby była widoczna tylko w obrębie pakietu).
0

Póki co myśle, że będę jej tylko używał jako klasy do dziedziczenia. Chcę sprawdzić czy moje przemyślenia co do dziedziczenia się sprawdzą. Powiedzmy, że staram sie teraz przenieść to czego się uczyłem o dziedziczeniu i polimofiźmie do rzeczywistości i rozwiązać pewien problem. Z tego co wiem (o ile dobrze wszystko zrozumiałem) to klasa abstrakcyjna musi mieć conajmniej jedną metodę abstrakcyjną, prawda? Czyli w każdej klasie, która dziedziczy po PostBase musiałbym jakąś niepotrzebną metodę implementować.

1

Nie, klasa abstrakcyjna nie musi mieć metod abstrakcyjnych (te muszą być zawsze nadpisane). Pewnie myślałeś o zależności w drugą stronę - jeśli masz chociaż jedną metodę abstrakcyjną, to musisz klasę oznaczyć jako abstrakcyjną.

0

Aha! Tak, pewnie musiało mi się pomieszać :) spróbuję i dam znać czy efekt jest taki jaki chciałem otrzymać :)

0
Matijas6113 napisał(a):

klasa abstrakcyjna musi mieć conajmniej jedną metodę abstrakcyjną, prawda?

Nieprawda. Skąd czerpiesz wiedzę, (bo widzę, że masz spore braki w rzeczach elementarnych)?

0
Matzreal napisał(a):

Nie, klasa abstrakcyjna nie musi mieć metod abstrakcyjnych (te muszą być zawsze nadpisane). Pewnie myślałeś o zależności w drugą stronę - jeśli masz chociaż jedną metodę abstrakcyjną, to musisz klasę oznaczyć jako abstrakcyjną.

Wygląda na to, że efekt będzie taki jak chciałem :) Dziękuję!

Luque napisał(a):
Matijas6113 napisał(a):

klasa abstrakcyjna musi mieć conajmniej jedną metodę abstrakcyjną, prawda?

Nieprawda. Skąd czerpiesz wiedzę, (bo widzę, że masz spore braki w rzeczach elementarnych)?

Chaotyczne uczenie się... właśnie staram się nadrobić zaległości :)

1

Dodam tylko, że klasa bazowa też nie musi być klasą abstrakcyjną. Jeżeli wszystkie konstruktory będą protected to nie utworzysz obiektu tej klasy na zewnątrz. Możesz to wówczas zrobić tylko z metod statycznych i ew. metod klasy dziedziczącej.

1

Ale obie klasy są w jednej dll'ce... Tylko, że chcę z klasy pochodnej korzystać poza dll'ką czyli:

Jeśli klasa jest publiczna to wszystkie jej publiczne elementy (typy publicznych pól, właściwości, parametrów i wartości zwracanych przez publiczne funkcje, oraz cała hierarchia dziedziczenia w górę) muszą być publiczne.

0
Sarrus napisał(a):

Dodam tylko, że klasa bazowa też nie musi być klasą abstrakcyjną.

Każda klasa bazowa powinna być abstrakcyjna. Trzeba mieć naprawdę dobry powód, aby tak nie robić.

0
somekind napisał(a):
Sarrus napisał(a):

Dodam tylko, że klasa bazowa też nie musi być klasą abstrakcyjną.

Każda klasa bazowa powinna być abstrakcyjna. Trzeba mieć naprawdę dobry powód, aby tak nie robić.

Ale nie ma takiego wymogu. W sensie, że da się w ten sposób zaimplementować.

0
somekind napisał(a):

Każda klasa bazowa powinna być abstrakcyjna. Trzeba mieć naprawdę dobry powód, aby tak nie robić.

jednym z naprawdę dobrych powodów, by w ogóle bawić się w dziedziczenie, to unikanie powielania kodu. Gdzie tam miejsce na abstrakcyjną bazę?

Od abstrakcji to są interfejsy.

0
Sarrus napisał(a):

Ale nie ma takiego wymogu. W sensie, że da się w ten sposób zaimplementować.

Ano niestety da się i jest to częsty błąd.

Azarien napisał(a):

jednym z naprawdę dobrych powodów, by w ogóle bawić się w dziedziczenie, to unikanie powielania kodu. Gdzie tam miejsce na abstrakcyjną bazę?

Od abstrakcji to są interfejsy.

Wszędzie tam, gdzie potrzebujesz abstrakcji i dodatkowo nie chcesz powielać kodu, jest miejsce na klasę bazową.

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