Jak przesłanić konstruktor klasy bazowej?

0

Witam,
Czy da się jakoś przesłonić konstruktor klasy bazowej aby jego metoda nie została wywołana? Przykładowy kod:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            MyBaseClass klasabazowa = new MyBaseClass("raz");
        }
        private void button2_Click(object sender, EventArgs e)
        {
            MySubClass klasapochodna = new MySubClass("dwa", 3);
        }
    }
    public class MyBaseClass
    {
        public MyBaseClass(string myBaseClassNeedsThis)
        {
            MessageBox.Show("To jest klasa bazowa: " + myBaseClassNeedsThis);
        }
    }
    public class MySubClass : MyBaseClass
    {
        public MySubClass(string myBaseClassNeedsThis, int anotherValue) : base(myBaseClassNeedsThis)
        {
            MessageBox.Show("To jest klasa pochodna: " + myBaseClassNeedsThis + " i " + anotherValue);
        }
    } 

Po kliknięciu na drugi przycisk pokazuje się również messageBox z klasy bazowej, jak się go pozbyć? Jakiś destruktor?

0
: base(myBaseClassNeedsThis)

w tym miejscu wywołujesz konstruktor klasy bazowej

dodanie znacznika <code class="csharp"> - furious programming

1

Nie wyswietlaj MessageBox w konstruktorze po prostu. Konstruktor sluzy do inicjalizacji obiektu, a nie interakcji z uzytkownikiem.

0

Wiem, bo konstruktor klasy pochodnej musi dziedziczyć po konstruktorze klasy bazowej, tylko czy da się zrobić aby metoda z klasy bazowej nie została wywołana z poziomu klasy pochodnej?

0

Mozesz:
#Zrobic metode prywatna, wtedy klasa pochodna nie bedzie jej dziedziczyla
#Przeslonic metode w klasie pochodnej, wtedy metoda bedzie taka sama, ale bedzie robic cos innego.

Moze powiedz do czego dazysz bo wyglada na zabijanie mrowki mlotem pneumatycznym.

0
n0name_l napisał(a):

Mozesz:
#Zrobic metode prywatna, wtedy klasa pochodna nie bedzie jej dziedziczyla
#Przeslonic metode w klasie pochodnej, wtedy metoda bedzie taka sama, ale bedzie robic cos innego.

#Jak zrobić messageBox.Show prywatną?
#Jak tą metodę przesłonić?

0

Ale po co chcesz ruszac MessageBox'a?

0

Aby go nie wyświetlać dwa razy. ;)

1
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            MyBaseClass klasabazowa = new MyBaseClass("raz");
            klasabazowa.ShowMessageBox();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            MySubClass klasapochodna = new MySubClass("dwa", 3);
            klasapochodna.ShowMessageBox();
        }
    }
    public class MyBaseClass
    {
		public string Message { get; protected set; }
  
        public MyBaseClass(string myBaseClassNeedsThis)
        {
        	Message = string.Format("To jest klasa bazowa: {0}", myBaseClassNeedsThis);
        }
        
        public void ShowMessageBox() { MessageBox.Show(Message); }
    }
    public class MySubClass : MyBaseClass
    {
        public MySubClass(string myBaseClassNeedsThis, int anotherValue) : base(myBaseClassNeedsThis)
        {
            Message = string.Format("To jest klasa pochodna: {0} i {1}", myBaseClassNeedsThis, anotherValue);
        }
    } 
0

A dodanie do klasy bazowej "MyBaseClass" konstruktora domyślnego "public MyBaseClass(){}" a w klasie pochodnej dodanie konstruktora "public MySubClass(int anotherValue){}" nie załatwia sprawy?

2

konstruktor służy tylko do konstrukcji elementu
nie możesz w nim niczego wyświetlać, pobierać od użytkownika czy jakkolwiek blokować działania programu

konstruktor ma tylko zrobić to co konieczne żeby obiekt mógł istnieć i wypierdzielać

dlatego obiekt podrzędny musi wywołać konstruktor nadrzędny bo rozszerza obiekt nadrzędny

to tak jakbyś budował dom na fundamentach ale chciał ominąć tworzenie fundamentów

nie twórz nigdy kilku ścieżek wywołań konstruktorów bo jeśli będziesz chciał dodać do obiektu jakiś obiekt który trzeba zainicjować, będziesz musiał dopisać inicjację do każdego konstruktora z osobna - możliwe że o którymś zapomnisz i program będzie miał ukryty bug
w dodatku jakbyś chciał stworzyć klasę podrzędną z podrzędnej to znowu będziesz musiał ominąć ten konstruktor i stworzyć trzecią ścieżkę

jeśli przeładowujesz konstruktor to zawsze z jednego konstruktora wywołuj inny, tak żeby wszystkie dorzecza spływały do wspólnej rzeki i tworzyły spójny potok

wypieprz tego pierdzielonego messageboxa do osobnej metody!

0
n0name_l napisał(a):

Fajnie obszedłeś ten problem. :)

Ale moim problemem jest pytanie, które pojawiło mi się podczas uczenia się Dziedziczenia - czy da się przesłonić lub w jakiś sposób nie wywoływać metody konstruktora klasy bazowej z poziomu klasy dziedziczącej, zakładając że klasa bazowa jest nietykalna? ;)

1

nie da się - to przeczy idei dziedziczenia

0

Co to jest "metoda konstruktora"?

0

Może o to ci chodzi:

using System;

namespace test001
{
    class Program
    {
        static void Main(string[] args)
        {
            new MySubClass("ala ma kota", 333);
            new MySubClass(666);
            Console.ReadKey();
        }
    }

    class MyBaseClass
    {
        public MyBaseClass()
        {
            Console.WriteLine("To jest klasa bazowa konstruktor domyslny");
        }
        public MyBaseClass(string myBaseClassNeedsThis)
        {
            Console.WriteLine("To jest klasa bazowa: " + myBaseClassNeedsThis);
        }
    }

    class MySubClass : MyBaseClass
    {
        public MySubClass(int anotherValue) // jawnie nie wywołuje
        {
            Console.WriteLine("To jest klasa pochodna bez jawnego wywołania bazowej: " + anotherValue);
        }
        public MySubClass(string myBaseClassNeedsThis, int anotherValue):base(myBaseClassNeedsThis)
        {
            Console.WriteLine("To jest klasa pochodna: " + myBaseClassNeedsThis + " i " + anotherValue);
        }
    }
}
0
somekind napisał(a):

Co to jest "metoda konstruktora"?

metoda użyta w konstruktorze. ;)

@_13th_Dragon - niestety nie, chodziło mi aby zrobić to nie zmieniając klasy bazowej. :)

usuniecie cytowania całego poprzedniego posta - furious programming

0

przeczytałeś moją odpowiedź z poprzedniej strony?
już dostałeś moim zdaniem wystarczające odpowiedzi i nie wiem czy jest sens ciągnąć temat

chyba że masz realny problem, który chcesz rozwiązać - wtedy teoretycznie jest to możliwe sięgając po bardziej zaawansowane możliwości języka zahaczające o rekompilację programu w locie

w praktyce większość obiektów nie będzie działać jeśli nie wywołasz na nich konstruktora; większość ma bowiem jakieś swoje pola prywatne które może tylko ruszyć ów nadrzędny konstruktor a bez których cały obiekt będzie się krzaczył

0

Tak przeczytałem, tylko ciekaw byłem innych opinii. :) Dzięki za odpowiedź i zamykam temat. Pozdrawiam!

usunięcie cytowania całego poprzedniego posta - furious programming

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