一件事前面的解決方案忽視的是,ImplementClass可以重新定義MethodToBeCalled而不是調用MustBeCalled -
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();
}
}
如果只有C#允許非重寫方法加以密封 - 像Java的final關鍵字!
我能想到的唯一方法就是使用委託而不是繼承,因爲可以將定義爲密封。我正在使用一個名稱空間和「內部」訪問修飾符來阻止提供實現類的新實現。另外,要覆蓋的方法必須定義爲受保護的,否則用戶可以直接調用它。
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");
}
}
如何通過子類調用AbstractClass.AbstractMethod來引發一個事件來調用AbstractClass.MustBeCalled。但仍然不確定如何去做。 – Jeff 2009-07-17 01:46:49