एक बात पूर्ववर्ती समाधान पर ध्यान न दें कि 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();
}
}
अगर केवल सी # अनुमति गैर अधिरोहित तरीकों सील किया जा करने के लिए - जावा के अंतिम कीवर्ड की तरह!
एकमात्र तरीका जिसे मैं इस पर काबू पाने के बारे में सोच सकता हूं वह है विरासत के बजाय प्रतिनिधिमंडल का उपयोग करना, क्योंकि को सीलबंद के रूप में परिभाषित किया जा सकता है। और मैं कक्षाओं को कार्यान्वित करने पर एक नया कार्यान्वयन रोकने से रोकने के लिए एक नामस्थान और "आंतरिक" पहुंच संशोधक का उपयोग कर रहा हूं। इसके अलावा, ओवरराइड करने की विधि को संरक्षित के रूप में परिभाषित किया जाना चाहिए, अन्यथा उपयोगकर्ता इसे सीधे कॉल कर सकते हैं।
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 का आह्वान किया जाता है तो एक सार को AbClClass.MustBeCalled का आह्वान करने के लिए उठाया जाता है। लेकिन फिर भी यह सुनिश्चित नहीं है कि इसे कैसे किया जाए। – Jeff