2012-02-02 12 views
8

एक्शनस्क्रिप्ट 3 में एकाधिक विरासत? क्या यह संभव है? मैंने कहीं पढ़ा है कि यह एएस 3 में संभव है।एक्शनस्क्रिप्ट में एकाधिक विरासत 3

यदि हाँ तो कैसे?

यह मेरा Doucument कक्षा A.as

package 
{ 
    import flash.display.MovieClip; 

    public class A extends MovieClip implements B 
    {  
     public var value1:Number=10; 

     public function A() 
     { 
      trace("A Class Constructor"); 
     } 
     public function hit():void 
     { 
      trace(value1+' from hit'); 
     } 
    } 
} 

एक और इंटरफ़ेस B.as

package 
    { 
     public interface B 
     { 
      trace(' interface '); 
      function hit():void; 
     } 
    } 

अग्रिम धन्यवाद है।

+7

आप केवल कर सकते हैं * एकल वर्ग से विस्तार *, लेकिन आप * लागू कर सकते हैं * के रूप में आपको पसंद के रूप में कई इंटरफेस। जब आप "एकाधिक विरासत" कहते हैं तो आप * क्या करने की कोशिश कर रहे हैं? –

+0

अन-स्पष्ट प्रश्न के लिए वोट दिया गया। व्यक्ति 'एकाधिक कार्यान्वयन' – WORMSS

+0

@WORMSS चाहता है: इसे इंटरफ़ेस का उपयोग करके एकाधिक विरासत कहा जाता है। –

उत्तर

73

एकाधिक वंशानुक्रम के रूप में संभव नहीं है। लेकिन इंटरफेस के साथ आप एकाधिक विरासत की कुछ कार्यक्षमताओं की नकल कर सकते हैं। http://en.wikipedia.org/wiki/Diamond_problem क्यों कई भाषाओं एमआई समर्थन नहीं करते हैं यही कारण है कि है, लेकिन केवल एक विरासत: एमआई बड़ी खामी, सबसे विशेष रूप से हीरे की समस्या है। इंटरफेस का उपयोग करके यह "प्रकट होता है" आप एमआई लागू करते हैं, लेकिन असल में यह मामला नहीं है क्योंकि इंटरफेस कार्यान्वयन प्रदान नहीं करते हैं, बल्कि कार्यक्षमता का केवल एक वादा है।

interface BadAss{ 
    function doSomethingBadAss():void; 
} 

interface Preacher{ 
    function quoteBible():void; 
} 

class CrazyGangsta implements BadAss, Preacher{ 
    function quoteBible():void{ 
     trace("The path of the righteous man is beset on all sides by the inequities of the selfish and the tyranny of evil men."); 
    } 
    function doSomethingBadAss():void{ 
     //do something badass 
    } 
} 

var julesWinnfield : CrazyGangsta = new CrazyGangsta(); 
julesWinnfield.doSomethingBadAss(); 
julesWinnfield.quoteBible(); 

//however, it mimics MI, since you can do: 

var mofo : BadAss = julesWinnfield; 
mofo.doSomethingBadAss(); 
//but not mofo.quoteBible(); 

var holyMan : Preacher = julesWinnfield; 
holyMan.quoteBible(); 
//but not holyMan.doSomethingBadAss(); 

पी.एस .: मामले में आप आश्चर्य करेंगे: इंटरफेस के साथ कोई हीरा समस्या नहीं है के बाद से इंटरफेस की एक implementor प्रत्येक सदस्य इंटरफेस में परिभाषित के ठीक एक कार्यान्वयन प्रदान करनी चाहिए। तो, भले ही दोनों इंटरफेस एक ही सदस्य (पाठ्यक्रम के समान हस्ताक्षर के साथ) को परिभाषित करेंगे, फिर भी केवल एक ही कार्यान्वयन होगा।

+0

तकनीकी रूप से यह एकाधिक विरासत नहीं है जो संभव नहीं है। हालांकि @ स्वाति-सिंह ने एवोब की टिप्पणी को देखते हुए ऐसा लगता है कि वह कई इंटरफेस चाहता है और यह इसके लिए एक सही समाधान होगा। – lordofthefobs

+22

यही कारण है कि मैंने अपना जवाब शुरू किया: "एएस में एकाधिक विरासत संभव नहीं है।" :) – Creynders

+0

@ क्रेंडर्स: बहुत बहुत धन्यवाद, मुझे मेरी गलती मिली है ... :) –

0

आप इंटरफ़ेस का उपयोग कर एकाधिक वंशानुक्रम कर सकते हैं।

  1. क्लास ए, बी और सी परिभाषित करें और कक्षा बी और सी क्रमशः आईबी और आईसी के लिए इंटरफेस परिभाषित करें।
  2. बस "विस्तार" कीवर्ड का उपयोग कर क्लास सी से क्लास ए तक फैलाता है - कक्षा
  3. का डायरेक्ट विरासत इंटरफ़ेस आईबी में आपके इंटरफ़ेस आईसी को बढ़ाता है।
Just check code as per your requirement: 

package 
{ 
    import flash.display.MovieClip; 
    public class A extends MovieClip implements B 
    { 
     public var value1:Number=10; 
     public function A() 
     { 
      trace("A Class Constructor"); 
     } 
     public function hit():void 
     { 
      trace(value1+' from hit'); 
     } 
     public function print():void 
     { 
      trace("Print Method Called"); 
     } 
    } 
} 

package 
{ 
    public interface B extends D 
    { 
     function hit():void; 
    } 
} 

package 
{ 
    public class C implements D 
    { 
     pulic function C() 
     { 
      trace("C Class Constructor"); 
     } 
     public function print():void 
     { 
      trace("Print Method Called"); 
     } 
    } 
} 

package 
{ 
    public interface D 
    { 
     function print():void; 
    } 
} 
+0

क्या आप इसे मेरे उदाहरण में कार्यान्वित कर सकते हैं? –

+0

हाय स्वाती, मैं आपके उदाहरण में कार्यान्वित कर सकता हूं। लेकिन क्या आप मुझे ईमेल के माध्यम से मुझे अपना उदाहरण कोड भेज सकते हैं क्योंकि आपके प्रश्न में आप केवल इंटरफ़ेस बी, कक्षा ए का उल्लेख करते हैं लेकिन इंटरफ़ेस सी का उल्लेख नहीं करते हैं। इसलिए मुझे कोड चाहिए। मेरा ईमेल पता [email protected] – Mrugesh

+0

मुरुष है: मैंने गलती से सी को क्रिएट किया है। मैंने अपना कोड अपडेट किया है कृपया इसे जांचें। आपके जवाब के लिए धन्यवाद। –

4

वैसे वहाँ कई अन्य OOP भाषाओं के कई तरह AS3 में सीधे विरासत की कोई संभावना नहीं है।

OOP कोड पुन: उपयोग और हम में से ज्यादातर की तरह कई वर्गों में लिखे कोड का पुन: उपयोग करना चाहते हैं के बारे में है। तो यदि आप वास्तव में केवल हस्ताक्षर के बजाय कोड (तर्क) का पुन: उपयोग करना चाहते हैं तो आप संरचना या डिलीगेशन दृष्टिकोणों पर विचार करना चाहेंगे और शायद यही वह है जिसे आपने कहीं पढ़ा है, जैसा आपने कहा था।

रचना में आप क्या बजाय उपवर्ग में एक baseclass इनहेरिट की है, तो आप एक उपवर्ग में baseclass का एक उदाहरण है और यह एक हैक नहीं है सभी तरीकों

package 
{ 
    public class BaseClass1 
    { 
     public function someMethod() 
     { 
      trace("This is from the BaseClass1"); 
     } 
    } 
} 

package 
{ 
    public class BaseClass2 
    { 
     public function anotherMethod() 
     { 
      trace("This is from the BaseClass2"); 
     } 
    } 
} 
package 
{ 
    //Composition 
    public class HasBase 
    { 
     private var baseClass1:BaseClass1; 
     private var baseClass2:BaseClass2; 
     public function HasBase() 
     { 
      baseClass1=new BaseClass1(); 
      baseClass2=new BaseClass2(); 
     } 
     public function someMethod() 
     { 
      baseClass1.someMethod(); 
     } 
     public function anotherMethod(){ 
      baseClass2.anotherMethod(); 
     } 
    } 
} 

होगा, लेकिन वास्तव में एक असली और कई डिजाइन पैटर्न में अनुभवी डेवलपर्स द्वारा अपनाए गए व्यावहारिक कार्यान्वयन।

आशा है कि यह

0

उम्म, दोस्तों की मदद करता है!

  1. #import सुविधा का उपयोग करना: http://archive.darronschall.com/weblog/2006/10/multiple-inheritance-in-actionscript-3.html

  2. मत भूलना कि ActionScript ECMAScript है

    मैं तुम्हें दो अलग अलग तरीकों के लिए "नकल" एकाधिक वंशानुक्रम दिखा सकते हैं। यह अभी भी एक प्रोटोटाइप आधारित भाषा है: http://jolierouge.net/2010/01/as3-multiple-inheritancemixins/

मुझे पता है ... नहीं 'असली' एमआई, पर वे look like a duck, speak like a duck...

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