Seite 1 von 1

[C#] Private virtuelle Methoden

Verfasst: 28.02.2012, 20:35
von BeRsErKeR
Hallo,

ich musste feststellen, dass C# keine privaten virtuellen (oder abstrakten) Methoden unterstützt. Ich würde jedoch gern folgendes realisieren:

Code: Alles auswählen

class Base
{
	public void Save(string filename)
	{
		// Do some encoding / compression / file-preparing here
		FileStream MyLocalStream = ...; // Create a file stream somehow

		this.WriteData(ref MyLocalStream);
	}

	protected abstract void WriteData(ref Stream stream);
}

Code: Alles auswählen

class Foo : Base
{
	private override void WriteData(ref Stream stream)
	{
		// Write some data of Foo to the stream
	}
}

Code: Alles auswählen

class Bar : Base
{
	private override void WriteData(ref Stream stream)
	{
		// Write some data of Bar to the stream
	}
}
Gibts eine Möglichkeit das elegant zu lösen oder ist mein Ansatz einfach falsch?

Re: [C#] Private virtuelle Methoden

Verfasst: 28.02.2012, 20:52
von Artificial Mind
Du suchst sealed wenn ich micht nicht irre.

Re: [C#] Private virtuelle Methoden

Verfasst: 29.02.2012, 00:10
von BeRsErKeR
Ich glaub nicht. Ich will nicht die Vererbung von Foo oder Bar verhindern. Ich möchte ein public-Interface, welches bereits in der Basisklasse implementiert ist (weil der Basiskram da drin für alle abgeleiteten Klassen sinnvoll ist) und nur ein kleiner Bruchteil soll dann aus diesem public-Interface über eine abstrakte/virtuelle private Methode realisiert werden, die die erbenden Klassen implementieren. Diese sollen von außen nicht direkt aufgerufen werden (da sie nur im Zusammenspiel mit dem public-Interface Sinn ergeben).

Re: [C#] Private virtuelle Methoden

Verfasst: 29.02.2012, 00:51
von dot
Wo genau liegt denn das Problem die Dinger protected zu machen?

Re: [C#] Private virtuelle Methoden

Verfasst: 29.02.2012, 12:34
von BeRsErKeR
Die Dinger sind protected (jedenfalls in der Basisklasse).

Re: [C#] Private virtuelle Methoden

Verfasst: 29.02.2012, 12:35
von dowhilefor
Was soll den deiner Meinung nach passieren, wenn du "nur" eine Base referenz hast? Du aber in der dahinter liegenden Kind klasse das interface von Base in private verwandelt hast? Das macht keinen Sinn und ist daher nicht möglich.
aber C# verbietet leider auch virtuelle protected Methoden. Das hätte ich vielleicht dazu sagen sollen.
Das wäre mir neu. Natürlich können protected methoden virtual sein. Aber logischweise muss dann die das override auch protected sein.

Re: [C#] Private virtuelle Methoden

Verfasst: 29.02.2012, 12:36
von Artificial Mind
BeRsErKeR hat geschrieben:Die Dinger sind protected (jedenfalls in der Basisklasse).
Und du kannst sie einfach protected in den abgeleiteten Klassen definieren.

Re: [C#] Private virtuelle Methoden

Verfasst: 29.02.2012, 12:38
von BeRsErKeR
Das Interface bleibt doch public, weil ich es gar nicht in den abgeleiteten Klasse anpacke (es ist ja nicht virtual). Ich überschreibe doch nur die protected-Methode, die von außen eh nicht erreicht werden kann.

@Artifical Mind: Hmm prinzipiell ja. Aber ob das in jedem Fall sinnvoll ist? Naja wäre erstmal eine Lösung.

Re: [C#] Private virtuelle Methoden

Verfasst: 29.02.2012, 12:40
von BeRsErKeR
dowhilefor hat geschrieben:
aber C# verbietet leider auch virtuelle protected Methoden. Das hätte ich vielleicht dazu sagen sollen.
Das wäre mir neu. Natürlich können protected methoden virtual sein. Aber logischweise muss dann die das override auch protected sein.
Ja das war wohl falsch formuliert. Ich hab leider grad keinen Compiler da, mir schwirrte nur die Fehlermeldung im Kopf rum, wo auch irgendwas von protected stand. Hab mich aber mal informiert und scheinbar geht es mit protected (zum Glück).

Re: [C#] Private virtuelle Methoden

Verfasst: 29.02.2012, 12:40
von dowhilefor
Von aussen ist relativ. Es können ja auch protected methoden von anderen klassen aufgerufen werden, wenn sie die selbe Basisklasse haben. Fakt ist das interface schreibt protected vor, dann darf die eigentliche implementierung das nicht ändern.

Re: [C#] Private virtuelle Methoden

Verfasst: 29.02.2012, 12:41
von Artificial Mind
BeRsErKeR hat geschrieben:@Artifical Mind: Hmm prinzipiell ja. Aber ob das in jedem Fall sinnvoll ist? Naja wäre erstmal eine Lösung.
Wieso sollte das denn nicht sinnvoll sein? Da es in der Base-Klasse protected ist, kann es von allen abgeleiteten Klassen gesehen und überschrieben werden, so wie du das ja auch machst. Wenn du irgendwann nicht mehr willst, dass es weiter überschrieben wird, machste halte sealed davor. Aber warum du die Sichtbarkeit von protected auf private einschränken willst, weiß ich nicht.

EDIT: ich habe das gerade nochmal ausprobiert, protected virtual geht prima ;) Benutze ich in CyberDive sogar an einigen Stellen.

Re: [C#] Private virtuelle Methoden

Verfasst: 29.02.2012, 12:49
von BeRsErKeR
Artificial Mind hat geschrieben:
BeRsErKeR hat geschrieben:@Artifical Mind: Hmm prinzipiell ja. Aber ob das in jedem Fall sinnvoll ist? Naja wäre erstmal eine Lösung.
Wieso sollte das denn nicht sinnvoll sein? Da es in der Base-Klasse protected ist, kann es von allen abgeleiteten Klassen gesehen und überschrieben werden, so wie du das ja auch machst. Wenn du irgendwann nicht mehr willst, dass es weiter überschrieben wird, machste halte sealed davor. Aber warum du die Sichtbarkeit von protected auf private einschränken willst, weiß ich nicht.
Ok verzeiht mir mein Unwissen. Ich mach noch nicht lange C#. Dachte dass sealed nur auf Klassen anwendbar ist. Das erübrigt natürlich den Wechsel von protected auf private, wie es in C++ z.B. dann sinnvoll gewesen wäre. Mir gings halt prinzipiell darum, dass ich das nicht endlos an alle abgeleiteten Klassen "überschreibbar weitergebe".
Artificial Mind hat geschrieben:EDIT: ich habe das gerade nochmal ausprobiert, protected virtual geht prima ;) Benutze ich in CyberDive sogar an einigen Stellen.
Ja hab mir grad mal ne VM mit Visual C# besorgt und getestet. Mit protected klappts, auch genau in der Form wie ich's brauche (also abstract).


Danke für die Hinweise.

Re: [C#] Private virtuelle Methoden

Verfasst: 29.02.2012, 12:55
von Artificial Mind
BeRsErKeR hat geschrieben:Ok verzeiht mir mein Unwissen. Ich mach noch nicht lange C#. Dachte dass sealed nur auf Klassen anwendbar ist. Das erübrigt natürlich den Wechsel von protected auf private, wie es in C++ z.B. dann sinnvoll gewesen wäre. Mir gings halt prinzipiell darum, dass ich das nicht endlos an alle abgeleiteten Klassen "überschreibbar weitergebe".
Ja kein Problem, ich hatte extra den MSDN Link geschickt weil die dort sogar in ihrem Beispiel eine einzelne Funktion mit sealed markieren ;) Wahrscheinlich hätte ich den Link nicht "sealed" nennen sollen oder etwas mehr dazuschreiben oder so^^