Eine Sache, die vorangehenden Lösungen zu ignorieren ist, dass ImplementClass MethodToBeCalled neu definieren und MustBeCalled nicht nennen -
public abstract class AbstractClass
{
public abstract void AbstractMethod();
private void MustBeCalled()
{
//will be invoked by MethodToBeCalled();
Console.WriteLine("AbstractClass.MustBeCalled");
}
public void MethodToBeCalled()
{
MustBeCalled();
AbstractMethod();
}
}
public class ImplementClass : AbstractClass
{
public override void AbstractMethod()
{
Console.WriteLine("ImplementClass.InternalAbstractMethod");
}
public new void MethodToBeCalled() {
AbstractMethod();
}
}
Wenn nur C# erlaubt nicht außer Kraft gesetzt Methoden versiegelt werden - wie Java Schlüsselwort final!
Die einzige Möglichkeit, dies zu überwinden, ist die Verwendung der Delegierung statt der Vererbung, da die Klassen als versiegelt definiert werden können. Und ich verwende einen Namespace und den "internen" Zugriffsmodifikator, um zu verhindern, dass eine neue Implementierung für implementierende Klassen bereitgestellt wird. Außerdem muss die Methode zum Überschreiben als geschützt definiert werden, andernfalls können Benutzer sie direkt aufrufen.
namespace Something
{
public sealed class OuterClass
{
private AbstractInnerClass inner;
public OuterClass(AbstractInnerClass inner)
{
this.inner = inner;
}
public void MethodToBeCalled()
{
MustBeCalled();
inner.CalledByOuter();
}
public void MustBeCalled()
{
//this must be called when AbstractMethod is invoked
System.Console.WriteLine("OuterClass.MustBeCalled");
}
}
public abstract class AbstractInnerClass
{
internal void CalledByOuter()
{
AbstractMethod();
}
protected abstract void AbstractMethod();
}
}
public class ImplementInnerClass : Something.AbstractInnerClass
{
protected override void AbstractMethod()
{
//when called, base.MustBeCalled() must be called.
//how can i enforce this?
System.Console.WriteLine("ImplementInnerClass.AbstractMethod");
}
public new void CalledByOuter()
{
System.Console.WriteLine("doesn't work");
}
}
Wie wäre es, wenn AbstractClass.AbstractMethod von Kind-Klasse aufgerufen wird ein Ereignis ausgelöst wird AbstractClass.MustBeCalled aufzurufen. Aber immer noch unsicher, wie es geht. – Jeff