Một điều các giải pháp trước bỏ qua là ImplementClass có thể xác định lại MethodToBeCalled và không gọi 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();
}
}
Nếu chỉ C# cho phép các phương pháp không ghi đè để được niêm phong - như từ khóa thức Java!
Cách duy nhất tôi có thể nghĩ để khắc phục điều này là sử dụng ủy quyền thay vì thừa kế, vì các lớp có thể được định nghĩa là bị niêm phong. Và tôi đang sử dụng không gian tên và công cụ sửa đổi truy cập "nội bộ" để ngăn chặn việc cung cấp triển khai mới khi triển khai các lớp. Ngoài ra, phương pháp ghi đè phải được định nghĩa là được bảo vệ, nếu không người dùng có thể gọi nó trực tiếp.
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");
}
}
Làm thế nào về khi AbstractClass.AbstractMethod được gọi bởi lớp con một sự kiện được gọi để gọi AbstractClass.MustBeCalled. Nhưng một lần nữa vẫn không chắc chắn làm thế nào để làm điều đó. – Jeff