निम्न नमूना कोड को ध्यान में रखते:सी #/नेट में 'नई' गुणों के पेशेवरों और विपक्ष?
// delivery strategies
public abstract class DeliveryStrategy { ... }
public class ParcelDelivery : DeliveryStrategy { ... }
public class ShippingContainer : DeliveryStrategy { ... }
और निम्न नमूना आदेश वर्ग:
// order (base) class
public abstract class Order
{
private DeliveryStrategy delivery;
protected Order(DeliveryStrategy delivery)
{
this.delivery = delivery;
}
public DeliveryStrategy Delivery
{
get { return delivery; }
protected set { delivery = value; }
}
}
जब मैं आदेश वर्ग के एक नए प्रकार निकाले जाते हैं, यह प्रकार DeliveryStrategy की डिलिवरी संपत्ति का वारिस होगा।
अब, जब यह दिया जाता है कि CustomerOrders ParcelDelivery रणनीति का प्रयोग दिया जाना चाहिए, हम विचार कर सकते हैं 'नई' CustomerOrder कक्षा में प्रसव संपत्ति ing:
public class CustomerOrder : Order
{
public CustomerOrder()
: base(new ParcelDelivery())
{ }
// 'new' Delivery property
public new ParcelDelivery Delivery
{
get { return base.Delivery as ParcelDelivery; }
set { base.Delivery = value; }
}
}
(CustomerOrder स्पष्ट रूप से करने की जरूरत है सुनिश्चित करें कि ऑर्डर के साथ संगत (पॉलिमॉर्फ) है
यह ग्राहक ऑर्डर पर पार्सल डिलीवरी रणनीति का सीधे उपयोग करने की आवश्यकता के बिना सीधे उपयोग की अनुमति देता है।
क्या आप इस पैटर्न का उपयोग करने पर विचार करेंगे? क्यों नहीं?
अद्यतन: जेनिक्स का उपयोग करने के बजाय, मैं इस पैटर्न के साथ आया, क्योंकि मैं इसे कई गुणों के लिए उपयोग करना चाहता हूं। मैं इन सभी गुणों के लिए सामान्य प्रकार के तर्कों का उपयोग नहीं करना चाहता
जब तक आपकी छायांकन विधि में कोई कठोर पूर्व शर्त नहीं है और कोई कमजोर पोस्टकंडिशन नहीं है, मुझे लगता है कि यह अभ्यास पूरी तरह से स्वीकार्य है। –
पहले उदाहरण में, आपको डिलिवरीस्ट्रेटी को वैसे भी क्यों डालना होगा? रणनीति पैटर्न का उपयोग करने का मुद्दा यह है कि व्यवहार एक इंटरफ़ेस को लागू करते हैं, और इसलिए सभी समान विधियां हैं, इसलिए उन्हें डालने की आवश्यकता नहीं है। –