ukrywanie metod publicznych klasy dziedziczonej

0

Czy da się zrobić tak, aby w instancjach klasy B nie można było odpalić publicznej Metody klasy A??

class A
{
     public void Metoda() {}
}

class B : A
{}
1

Też bym chciał coś takiego ;(
Jednak jest to niemożliwe, bo zaprzecza dziedziczeniu - każdego obiektu klasy dziedziczącej można przecież używać jako klasy dziedziczonej. Nadpisz tą metody po prostu jako 'pustą' i oznacz ją jako Obsolete.

0

Wszystko zalezy jak duza funkcjonalnosc ma miec Twoj obiekt. Zamiast dziedziczenia mozesz uzyc zagniezdzenia. Wowczas musisz zaimplementowac wszystkie metody jakie Twoja klasa ma udostepniac publicznie i beda one odwolywaly sie do wewnetrznej instancji klasy zagniezdzonej. A czego nie zaimplementujesz przez takie odwolania tego po prostu nie bedzie :)

Wiec jak widac... da sie, ale z dziedziczeniem nie ma to nic wspolnego ;)

0

Być może jest prostszy sposób, ale do głowy mi przyszło zakrycie metody w klasie B publiczną metodą Metoda() zawierającą jedną linijkę: return;

1

@up - albo i bez return, na jedno wychodi ;). To samo napisałem, tylko poradziłem żeby oznaczyć jeszcze metodę jako Obsolete - czyli przestarzałą, nie_do_używania.

@wasiu - no można, ale po co komplikować, spowalniać kod i zwiększać plik wykonywalny, skoro można po prostu zignorować jedną funkcję. No, chyba że ktoś ma fioła na punkcie "czystości" kodu ;)

0

MSM:
Tak, tyle, że napisałem posta na nieodświeżonej stronie, gdy nie było żadnych odpowiedzi :)
Bywa,
pozdrawiam

0

aby przykrys metode (i wstawic taka sama nic nie robiaca) jest slowo kluczowe new

 class A
        {
            public void Metoda() 
            {
               
            }
        }

        class B : A
        {
            public new void Metoda() 
            {
               
            }
        }
0

A nie ma jakiegos sposobu zeby w metodzie wykryc, czy jest ona wywoływana z obiektu klasy bazowej, czy dziedziczonej? Wtedy w drugim przypadku mozna by było np wyjątek rzucić. W ogole "nic nie robić" to bezsens, jezeli juz to jakis wyjątek rzucić wg mnie.

1
public new void Metoda()
{
    throw new Exception();
}
  • wtedy metoda może być tylko z dziedziczonej ;)

Ale cały czas zrzędzę: nie rzucaj wyjątku tylko dodaj obsolete, OBSOLETE, O.B.S.O.L.E.T.E!!!

Rzucanie wyjątku jest IMO bez sensu, bo co jeśli ktoś będzie chciał użyć twojej klasy jak klasy bazowej? Dostanie w bloku kodu wyjątek którego się za ch... nie spodziewał.

0

nie wiem jaki układ masz w kodzie ale czy nie poprawniej byłoby stworzyć trzecią klasę abstrakcyjną z której te dwie będą dziedziczyć?

abstract class A {}

class B : A
{
   public void Metoda() { }
}

class C : A { }

i jest to co chciałeś

1

Tak, to może być dobre rozwiązanie ;)

Sam miałem doświadczenia nt. dziedziczenia po klasie Control, i problem polegał na tym że Control zawierała stertę metod i właściwości (z Font i Text na czele) które za chiny mi nie były potrzebne. A sposobu na ominięcie tego nie było.

@Zagadker - powiedz czy rozwiązanie cię satysfakcjonuje :)

0

Bardzo dziękuje wszystkim za odpowiedzi.
rozwiazania mnie stysfakcjonują :D
pozdrawiam

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