2015-04-21 9 views
6

मैं एक
दसवीं कक्षा लिखने के लिए चाहते हैं (यह है), जो एक (आधार) से
inherits कर सकते हैं
बी (?) के तरीकों पर अमल और
सदस्यों को लागू करना चाहिए सी (इंटरफ़ेस) का।
क्या ऐसी कक्षा की तरह कुछ है जिसे कार्यान्वित किया जा सकता है?

ए और सी लागू करना कोई समस्या नहीं है। लेकिन चूंकि एक्स कई वर्गों से प्राप्त नहीं हो सकता है, इसलिए एक्स को ए और बी के तर्क का उत्तराधिकारी होना असंभव लगता है। ध्यान दें कि ए एक बहुत ही महत्वपूर्ण आधार वर्ग है और बी लगभग एक इंटरफेस है लेकिन निष्पादन योग्य व्यवहार है। कारण मैं नहीं चाहता कि बी एक इंटरफ़ेस हो, क्योंकि यह व्यवहार हर वर्ग के लिए समान होता है जो इसे प्राप्त करता है या लागू करता है।

मैं वास्तव में एक अंतरफलक के रूप बी घोषित करने और प्रत्येक एक्स कि बी के व्यवहार की जरूरत के लिए कोड के ठीक उसी 10 लाइनों को लागू करना चाहिए है?


2 महीने बाद
मैं वर्तमान में UE4 में इसका उपयोग करने (अवास्तविक इंजन 4) के लिए सी सीख रहा हूँ ++।
सी ++ के बाद से सी # में बहुत कम सख्त है यह वास्तव में एक पैटर्न कार्यान्वयन idom अवधि है कि इस व्यवहार का वर्णन होता है: ये mixin रों कहा जाता है।

आप पेज 9 (दूसरे पैराग्राफ) पर सी ++ मिक्सिन here के बारे में एक पैराग्राफ पढ़ सकते हैं।

+2

क्यों न तुम सिर्फ बी ए से विरासत या ठीक इसके विपरीत? –

+3

आप यहां रचना का उपयोग क्यों नहीं कर सकते? बी के उदाहरण के लिए बी के तरीकों को प्रतिनिधि ...(इस तरह की चीज के बारे में बात करना बहुत मुश्किल है। यदि आप एक ठोस उदाहरण देंगे तो यह अधिक उपयोगी होगा।) –

+0

@ k4rlsson क्योंकि प्रत्येक एक्स को बी की आवश्यकता नहीं है (देव इसे लागू करने में सक्षम होना चाहिए या नहीं) –

उत्तर

5

देखो मैं वास्तव में प्रत्येक X की जरूरत है कि हो सकता है के लिए B एक अंतरफलक के रूप में घोषित और लागू करना चाहिए है कोड के ठीक उसी 10 लाइनों B का हैविर?

हां और नहीं। आपको B एक इंटरफ़ेस बनाने की आवश्यकता है। लेकिन इंटरफेस के सभी कार्यान्वयन में सामान्य विधि कार्यान्वयन को डुप्लिकेट नहीं किया जाना चाहिए। इसके बजाय, वे इंटरफ़ेस B के लिए एक वर्ग के विस्तार में जाने चाहिए:

public interface B { 
    void MethodX(); 
    void MethodY(); 
} 
public static class ExtensionsB { 
    public static void MethodZ(this B b) { 
     // Common implementations go here 
    } 
} 

विस्तार के तरीकों, कार्यान्वयन साझा करने के लिए "क्षैतिज" एक तरीका प्रदान अपनी कक्षाओं एक द्वितीय श्रेणी से विरासत बिना। विस्तार तरीकों से व्यवहार करते हैं जैसे कि वे वर्ग की नियमित तरीकों थे:

class X : A, B { 
    public void MethodX() {...} 
    public void MethodY() {...} 
} 
public static void Main(string[] args) { 
    var x = new X(); 
    x.SomeMethodFromA(); 
    x.MethodX(); // Calls method from X 
    x.MethodY(); // Calls method from X 
    x.MethodZ(); // Calls method from ExtensionsB 
} 
+0

यह सही है! मैं चाहता हूं कि आप अपनी विस्तार कक्षा में "कक्षा" विशेषता जोड़ना चाहें। और मैं यह ध्यान रखना चाहता हूं कि एक्सटेंशन विधि का उपयोग कक्षा के भीतर से किया जा सकता है। एक्सटेंशन()। कक्षा के भीतर कॉलिंग एक्सटेंशन() काम नहीं करता है। –

1

मुझे लगता है कि आपका सर्वश्रेष्ठ दांव A के निर्माता में B का एक उदाहरण की आवश्यकता होती है और फिर बेनकाब या B के तरीके के रूप में आवश्यक कॉल करने के लिए होगा:

public class X : A, C 
{ 
    private readonly B _b; 

    public X(B b) 
    { 
     _b = b; 
    } 
} 

आप के बारे में जानकारी का एक बहुत कुछ मिल जाएगा दृष्टिकोण की इस तरह यदि आप ऊपर Composition over inheritance

+0

वह देव को लागू करने (घोषित) बी को मजबूर करेगा लेकिन मैं चाहता हूं कि देव स्वयं को चुनने (लागू) करने की अनुमति दे। जैसे कि बी एक इंटरफेस –

+0

है, मुझे सच में यकीन नहीं है कि आपका क्या मतलब है; कार्यान्वयन और घोषणा एक ही बात नहीं है। यदि आप एक ठोस उदाहरण देते हैं तो समाधान की अनुशंसा करना आसान हो सकता है। लेकिन संरचना एक सुंदर लचीला दृष्टिकोण है। – RagtimeWilly

+0

एक विशिष्ट उदाहरण प्रदान नहीं करने के लिए खेद है। मेरा मतलब यह था कि आपका एक्स हमेशा बी का एक क्षेत्र घोषित करता है लेकिन मैं यह तय करने में सक्षम होना चाहता हूं कि मेरा एक्स बी (लागू) बी का उपयोग करता है या नहीं। "Dasblinkenlight" द्वारा प्रदान किए गए उत्तर के साथ अब मैं अपने एक्स पर बी को लागू करने या इसे अनदेखा करने का निर्णय ले सकता हूं। अगर मैं इसे अनदेखा करना चुनता हूं तो मेरे एक्स –

संबंधित मुद्दे

 संबंधित मुद्दे