Let कहते हैं कि मैं इस तरह एक वर्ग है:Liskov Substition और संरचना
public sealed class Foo
{
public void Bar
{
// Do Bar Stuff
}
}
और मैं यह विस्तार करने के लिए एक विस्तार विधि क्या कर सकते हैं परे कुछ जोड़ना चाहते हैं .... मेरे ही एकमात्र विकल्प रचना है:
public class SuperFoo
{
private Foo _internalFoo;
public SuperFoo()
{
_internalFoo = new Foo();
}
public void Bar()
{
_internalFoo.Bar();
}
public void Baz()
{
// Do Baz Stuff
}
}
हालांकि यह काम करता है, यह बहुत काम है ... लेकिन मैं अभी भी किसी समस्या का सामना:
public void AcceptsAFoo(Foo a)
मैं एक फू में पारित कर सकते हैं यहां, लेकिन एक सुपर फू नहीं, क्योंकि सी # को पता नहीं है कि सुपरफू वास्तव में लिस्कोव प्रतिस्थापन भावना में अर्हता प्राप्त करता है ... इसका मतलब है कि संरचना के माध्यम से मेरी विस्तारित कक्षा बहुत सीमित उपयोग है।
इसलिए, यह तय करने के लिए एक ही रास्ता है उम्मीद है कि मूल एपीआई डिजाइनरों एक इंटरफेस के आसपास बिछाने छोड़ दिया है:
public interface IFoo
{
public Bar();
}
public sealed class Foo : IFoo
{
// etc
}
अब, मैं SuperFoo पर IFoo लागू कर सकते हैं (जो बाद से SuperFoo पहले से ही फू लागू करता है, है सिर्फ हस्ताक्षर बदलने की बात है)।
public class SuperFoo : IFoo
और आदर्श दुनिया में, तरीकों कि उपभोग फू IFoo के उपभोग होगा:
public void AcceptsAFoo(IFoo a)
अब, सी # आम इंटरफेस के कारण SuperFoo और फू के बीच के रिश्ते को समझता है और सब कुछ ठीक है।
बड़ी समस्या यह है कि .NET कई कक्षाओं को सील करता है जो कभी-कभी विस्तार करने के लिए अच्छा होता है, और वे आम तौर पर एक सामान्य इंटरफेस को लागू नहीं करते हैं, इसलिए एफओ लेने वाले एपीआई विधियों को सुपरफू स्वीकार नहीं किया जाएगा और आप कर सकते हैं एक अधिभार जोड़ें नहीं।
तो, सभी रचना प्रशंसकों के लिए वहां .... आप इस सीमा के आसपास कैसे जाते हैं?
एकमात्र चीज जिसे मैं सोच सकता हूं वह आंतरिक फू को सार्वजनिक रूप से बेनकाब करना है, ताकि आप इसे अवसर पर पारित कर सकें, लेकिन यह गन्दा लगता है।
यह सबसे अच्छा जवाब है, हालांकि SixLetterVariable एक उत्कृष्ट बिंदु लाता है। प्रश्न के आगे पढ़ने पर – FlySwat
+1, आपने वास्तव में इसका उत्तर दिया। उसे एहसास नहीं हुआ कि वह पहले तकनीकी कार्यवाही की तलाश में था! – user7116