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
{}
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
{}
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.
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 ;)
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;
@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 ;)
MSM:
Tak, tyle, że napisałem posta na nieodświeżonej stronie, gdy nie było żadnych odpowiedzi :)
Bywa,
pozdrawiam
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()
{
}
}
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.
public new void Metoda()
{
throw new Exception();
}
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ł.
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ś
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 :)
Bardzo dziękuje wszystkim za odpowiedzi.
rozwiazania mnie stysfakcjonują :D
pozdrawiam