Laden...

Methode einer Basisklasse versiegeln

Erstellt von solick vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.321 Views
Thema geschlossen
S
solick Themenstarter:in
56 Beiträge seit 2009
vor 12 Jahren
Methode einer Basisklasse versiegeln

Hi,

habe da mal eine Verständnisfrage:

Mit sealed kann man ja bei abgeleiteten Klassen eine weitere Vererbung verhindern.

Wenn ich sealed aber in der Basisklasse verwenden möchte, dann meckert er.

Kann man auch die Methode einer Basisklasse für eine Vererbung sperren?

Hintergrund:

Ich möchte in einer vererbten Klasse die Methode einer Basisklasse nicht aufrufbar machen.

Vielen Dank und beste Grüße

Solick

K
62 Beiträge seit 2009
vor 12 Jahren

Vielleicht versteh ich dich ja einfach nur falsch, aber:

private ?

S
solick Themenstarter:in
56 Beiträge seit 2009
vor 12 Jahren

Nein, wenn ich die Methode in der Basisklasse private deklariere kann ich sie ja nie durch das Objekt aufrufen.

Ich geb mal ein Beispiel:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            foo1 f1 = new foo1("foo1");
            foo2 f2 = new foo2("foo2", "foo1");


            f1.printIt();
            f2.printIt(false);
            f2.printIt(true);
            f2.printIt();

            Console.ReadKey();
        }
    }


    class foo1
    {

        protected String _str;


        public foo1(String str)
        {
            _str = str;
        }


        public void printIt()
        {
            Console.WriteLine("Str: " + _str);
        }


    }


    class foo2 : foo1
    {
        String _str2;


        public foo2(String str2, String str) : base(str)
        {

            _str2 = str2;
        }

        public void printIt()
        {
            Console.Write("foo2 -Str: " + base._str);

        }

        public void printIt(bool b)
        {
            if (b)
            {
                Console.WriteLine("Str2: " + _str2);
            }
            else
            {
                Console.Write("Str: " + base._str);
            }
        }

    }
}


f2.printIt() soll verhindert werden.

Beste Grüße

solick

M
334 Beiträge seit 2007
vor 12 Jahren

Vererbung bedeutet, dass alle Funktionen der Basisklasse übernimmst und erweiterst. Das ist das Prinzip der Vererbung.

Wenn du auf so eine Funktion angewiesen bist solltest du deine Architektur nochmal überdenken. Das sind allerdings Grundlagen.

S
solick Themenstarter:in
56 Beiträge seit 2009
vor 12 Jahren

Kann ich das ggf. mit einer abstrakten Basisklasse lösen?

5.658 Beiträge seit 2006
vor 12 Jahren

Hi solick,

ich denke, mabo hat alles dazu gesagt, was dazu zu sagen ist. Auch eine abstrakte Klasse ändert daran nichts. Bitte schau dir dazu mal die entsprechenden Kapitel im OpenBook (🛈 ) an oder in der Dokumentation auf MSDN, dann erübrigen sich solche Nachfragen von ganz allein.

Christian

Weeks of programming can save you hours of planning

Hinweis von herbivore vor 12 Jahren

Korrekt, das Problem ist hier der falsche Ansatz. Vererbung ist immer Spezialisierung im Sinne von Erweiterung und nicht von Einschränkung. Dagegen sollte man nicht verstoßen, sonst verletzt man das Liskovsches Substitutionsprinzip. Allerdings fällt das ganze unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1 und 1.1.

Thema geschlossen