2016-08-08 8 views

उत्तर

10

प्रलेखन यहाँ की मदद करनी चाहिए:

Interfaces Extending Classes

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

यह उपयोगी है जब आपके पास बड़ी विरासत पदानुक्रम है, लेकिन चाहते हैं कि यह निर्दिष्ट करने के लिए कि आपका कोड केवल उप-वर्गों के साथ काम करता है जिनमें गुण हैं। बेस क्लास से विरासत के अलावा उप-वर्गों को संबंधित नहीं होना चाहिए। उदाहरण के लिए:

class Control { 
    private state: any; 
} 

interface SelectableControl extends Control { 
    select(): void; 
} 

class Button extends Control { 
    select() { } 
} 

class TextBox extends Control { 
    select() { } 
} 

class Image extends Control { 
} 

class Location { 
    select() { } 
} 

तो, जबकि

  • extends का मतलब है - यह लगभग एक अंतरफलक को लागू करने की तरह है इस मामले में अपनी मूल
  • implements से सभी हो जाता है। चाइल्ड ऑब्जेक्ट यह दिखा सकता है कि यह माता-पिता है .. लेकिन इसे कोई कार्यान्वयन नहीं मिला है
+0

जब आप कहते हैं कि "' extends'-यह सब अपने माता पिता से हो जाता है ", यह निजी सदस्यों के लिए लागू होता है? उदाहरण के लिए 'वर्ग व्यक्ति {निजी नाम: स्ट्रिंग} वर्ग आदमी व्यक्ति को बढ़ाता है {लिंग: स्ट्रिंग;}' क्या 'व्यक्ति का नाम संपत्ति है? – davejoem

+0

निजी भी हैं। टीएस द्वारा बस पहुंच योग्य नहीं। उन्हें संरक्षित करें और आप उनका उपयोग कर सकते हैं। "उपकरण" के मामले में केवल सार्वजनिक हिस्सा समझ में आता है। उम्मीद है कि यह थोड़ा –

19

टाइपस्क्रिप्ट (और कुछ अन्य ओओ भाषाओं) में आपके पास कक्षाएं और इंटरफेस हैं।

एक इंटरफ़ेस में कोई कार्यान्वयन नहीं है, यह इस प्रकार के सदस्यों/विधि का सिर्फ "अनुबंध" है।
उदाहरण के लिए: x और y, और एक विधि distance जो एक और Point उदाहरण प्राप्त करता है और एक number रिटर्न:

interface Point { 
    x: number; 
    y: number; 
    distance(other: Point): number; 
} 

उदाहरण है जो इस Point इंटरफ़ेस को लागू प्रकार संख्या के दो सदस्यों होना आवश्यक है।
इंटरफ़ेस इनमें से किसी भी को लागू नहीं करता है।

class PointImplementation implements Point { 
    public x: number; 
    public y: number; 

    constructor(x: number, y: number) { 
     this.x = x; 
     this.y = y; 
    } 

    public distance(other: Point): number { 
     return Math.sqrt(Math.pow(this.x - other.x, 2) + Math.pow(this.y - other.y, 2)); 
    } 
} 

(code in playground)

अपने उदाहरण में आप जब आप इसे एक अंतरफलक के रूप का विस्तार करने और एक बार जब आप इसे लागू करने के लिए अपने Person वर्ग एक बार एक वर्ग के रूप का इलाज:

वर्ग कार्यान्वयन हैं।
आपका कोड:

क्लास 'मैन' गलत तरीके से लागू करता है इंटरफ़ेस 'व्यक्ति':

class Person { 
    name: string; 
    age: number; 
} 
class Child extends Person {} 

class Man implements Person {} 

एक संकलन त्रुटि कह है।
संपत्ति 'नाम' प्रकार 'मैन' में गायब है।

और ऐसा इसलिए है क्योंकि इंटरफेस में कार्यान्वयन की कमी है।
तो अगर आप implement एक वर्ग तो आप केवल, कार्यान्वयन के बिना अपने "अनुबंध" ले ताकि आप यह करने के लिए की आवश्यकता होगी:

निष्कर्ष है

class NoErrorMan implements Person { 
    name: string; 
    age: number; 
} 

(code in playground) कि अधिकांश मामलों में आप extend एक और कक्षा चाहते हैं और implement पर नहीं।

1

@ nitzan-tomer से शानदार उत्तर! मुझे बहुत मदद मिली ... मैंने अपना डेमो थोड़ा सा बढ़ाया:

IPoint interface; 
Point implements IPoint; 
Point3D extends Point; 

और वे एक आईपॉइंट प्रकार की अपेक्षा करने वाले कार्यों में कैसे व्यवहार करते हैं।

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

Hier extended demo

+0

मदद करता है यह प्रश्न का उत्तर प्रदान नहीं करता है। किसी लेखक से स्पष्टीकरण की आलोचना या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/18734440) – aronisstav

+0

@aronisstav मैंने केवल एक अच्छा उत्तर दिया जो मुझे एक अच्छा जवाब मिला जो पहले से ही मेरी मदद करता है। लेकिन शायद किसी और को वह काम मिलेगा जो मैंने डेमो को उपयोगी बना दिया था। बस इतना ही। टिप्पणियां वास्तव में कोड-ब्लॉक डालने के लिए नहीं हैं, इसलिए मुझे उत्तर-पोस्ट में बेहतर समझने योग्य लगता है। तो इसके साथ क्या समस्या है? – andzep

+0

आपका उत्तर (स्वचालित रूप से?) लंबाई और सामग्री के कारण ध्वजांकित था, मेरी समीक्षा कतार में दिखाई दिया और मैंने ध्वज में प्रस्तुत कारणों के लिए योग्यता दी। इसका मुख्य योगदान (समझाते हुए कि आपने डेमो बढ़ाया है) एक टिप्पणी के रूप में बेहतर होगा। अतिरिक्त अनुच्छेद के साथ शायद यह वास्तव में अधिक उपयोगी है। – aronisstav

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