विधि ओवरलोडिंग?

वोट
75

वहाँ टाइपप्रति भाषा में विधि ओवरलोडिंग करने के लिए एक तरीका है?

मैं कुछ इस तरह हासिल करना चाहते हैं:

class TestClass {
    someMethod(stringParameter: string): void {
        alert(Variant #1: stringParameter =  + stringParameter);
    }

    someMethod(numberParameter: number, stringParameter: string): void {
        alert(Variant #2: numberParameter =  + numberParameter + , stringParameter =  + stringParameter);
    }
}

var testClass = new TestClass();
testClass.someMethod(string for v#1);
testClass.someMethod(12345, string for v#2);

यहाँ मैं (मैं वास्तव में जे एस में हैक अधिक भार का वह हिस्सा नफरत) करने के लिए नहीं करना चाहते का एक उदाहरण है:

class TestClass {
    private someMethod_Overload_string(stringParameter: string): void {
        // A lot of code could be here... I don't want to mix it with switch or if statement in general function
        alert(Variant #1: stringParameter =  + stringParameter);
    }

    private someMethod_Overload_number_string(numberParameter: number, stringParameter: string): void {
        alert(Variant #2: numberParameter =  + numberParameter + , stringParameter =  + stringParameter);
    }

    private someMethod_Overload_string_number(stringParameter: string, numberParameter: number): void {
        alert(Variant #3: stringParameter =  + stringParameter + , numberParameter =  + numberParameter);
    }

    public someMethod(stringParameter: string): void;
    public someMethod(numberParameter: number, stringParameter: string): void;
    public someMethod(stringParameter: string, numberParameter: number): void;

    public someMethod(): void {
        switch (arguments.length) {
        case 1:
            if(typeof arguments[0] == string) {
                this.someMethod_Overload_string(arguments[0]);
                return;
            }
            return; // Unreachable area for this case, unnecessary return statement
        case 2:
            if ((typeof arguments[0] == number) &&
                (typeof arguments[1] == string)) {
                this.someMethod_Overload_number_string(arguments[0], arguments[1]);
            }
            else if ((typeof arguments[0] == string) &&
                     (typeof arguments[1] == number)) {
                this.someMethod_Overload_string_number(arguments[0], arguments[1]);
            }
            return; // Unreachable area for this case, unnecessary return statement
        }
    }
}


var testClass = new TestClass();
testClass.someMethod(string for v#1);
testClass.someMethod(12345, string for v#2);
testClass.someMethod(string for v#3, 54321);
02/10/2012 को 11:03
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


6 जवाब

वोट
107

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

अगर मैं यह सही ढंग से समझ, आपको पहले भार के प्रत्येक के लिए एक विधि घोषणा और फिर लिखने की एक विधि कार्यान्वयन कि अपने तर्कों की जाँच करता है तय करने के लिए जो अधिभार बुलाया गया था। कार्यान्वयन के हस्ताक्षर भार के सभी के साथ संगत हो गया है।

class TestClass {
    someMethod(stringParameter: string): void;
    someMethod(numberParameter: number, stringParameter: string): void;

    someMethod(stringOrNumberParameter: any, stringParameter?: string): void {
        if (stringOrNumberParameter && typeof stringOrNumberParameter == "number")
            alert("Variant #2: numberParameter = " + stringOrNumberParameter + ", stringParameter = " + stringParameter);
        else
            alert("Variant #1: stringParameter = " + stringOrNumberParameter);
    }
}
02/10/2012 को 12:00
का स्रोत उपयोगकर्ता

वोट
18

स्पष्टता के लिए अद्यतन करें। विधि टाइपप्रति में अधिक भार insofar के रूप में यह आप एक API का प्रतिनिधित्व करने की आवश्यकता है कि के साथ मौजूदा पुस्तकालयों के लिए प्रकार परिभाषाएं बनाने की अनुमति देता एक उपयोगी सुविधा है।

जब अपने खुद के कोड लिखने, हालांकि, आप अच्छी तरह से वैकल्पिक या डिफ़ॉल्ट पैरामीटर का उपयोग कर भार के के संज्ञानात्मक भूमि के ऊपर से बचने के लिए सक्षम हो सकता है। इस विधि भार के लिए अधिक पठनीय विकल्प है और यह भी अपने एपीआई ईमानदार रहता है के रूप में आप unintuitive आदेश के साथ भार के बनाने से बचना होगा।

टाइपप्रति के सामान्य कानून overloads है:

आप अधिभार हस्ताक्षर नष्ट कर सकते हैं और अपने परीक्षण के सभी पारित, तो आप टाइपप्रति भार के की जरूरत नहीं है

आप आम तौर पर वैकल्पिक, या डिफ़ॉल्ट पैरामीटर के साथ एक ही बात को प्राप्त कर सकते हैं - या संघ प्रकार के साथ अथवा वस्तु-उन्मुखीकरण का एक सा है।

वास्तविक प्रश्न

वास्तविक सवाल की एक अधिभार के लिए पूछता है:

someMethod(stringParameter: string): void {

someMethod(numberParameter: number, stringParameter: string): void {

अब जिन भाषाओं में अलग कार्यान्वयन (ध्यान दें: टाइपप्रति भार के एक भी कार्यान्वयन का हिस्सा) के साथ भार के समर्थन में भी - प्रोग्रामर सलाह आदेश में स्थिरता प्रदान करने के लिए कर रहे हैं। यह हस्ताक्षर बनाना होगा:

someMethod(stringParameter: string): void {

someMethod(stringParameter: string, numberParameter: number): void {

stringParameterहमेशा की तरह, आवश्यक तो यह पहले से चला जाता है है। तुम एक काम कर टाइपप्रति अधिभार के रूप में इस लिख सकते हैं:

someMethod(stringParameter: string): void;
someMethod(stringParameter: string, numberParameter: number): void;
someMethod(stringParameter: string, numberParameter?: number): void {
    if (numberParameter != null) {
        // The number parameter is present...
    }
}

लेकिन टाइपप्रति भार के के कानून का पालन, हम अधिभार हस्ताक्षर नष्ट कर सकते हैं और हमारे सभी परीक्षण अभी भी पारित करेंगे।

someMethod(stringParameter: string, numberParameter?: number): void {
    if (numberParameter != null) {
        // The number parameter is present...
    }
}

वास्तविक प्रश्न, वास्तविक आदेश में

आप मूल आदेश के साथ लागू करने के लिए निर्धारित किया गया है, तो भार के होगा:

someMethod(stringParameter: string): void;
someMethod(numberParameter: number, stringParameter: string): void;
someMethod(a: string | number, b?: string | number): void {
  let stringParameter: string;
  let numberParameter: number;

  if (typeof a === 'string') {
    stringParameter = a;
  } else {
    numberParameter = a;

    if (typeof b === 'string') {
      stringParameter = b;
    }
  }
}

अब जब कि बाहर काम करने के जहां मापदंडों डाल करने के लिए शाखाओं का एक बहुत क्या होता है अगर हम टाइपप्रति भार के का कानून लागू है, लेकिन आप वास्तव में इस आदेश को संरक्षित रखें यदि आप इस दूर पढ़ रहे हैं ... लेकिन रुकिए,?

someMethod(a: string | number, b?: string | number): void {
  let stringParameter: string;
  let numberParameter: number;

  if (typeof a === 'string') {
    stringParameter = a;
  } else {
    numberParameter = a;

    if (typeof b === 'string') {
      stringParameter = b;
    }
  }
}

बस शाखाओं में बंटी पहले से ही

बेशक, प्रकार की जाँच की मात्रा हम क्या करने की जरूरत को देखते हुए ... शायद सबसे अच्छा जवाब बस दो तरीके होते है, के लिए है:

someMethod(stringParameter: string): void {
  this.someOtherMethod(0, stringParameter);
}

someOtherMethod(numberParameter: number, stringParameter: string): void {
  //...
}
02/10/2012 को 11:16
का स्रोत उपयोगकर्ता

वोट
7

मैं चाहता हूँ। मैं इस सुविधा भी चाहते हैं, लेकिन टाइपप्रति untyped जावास्क्रिप्ट जो अतिभारित विधि नहीं है के साथ अंतर-संचालित होने की जरूरत है। अपने अतिभारित विधि जावास्क्रिप्ट से कहा जाता है यानी तो यह केवल एक ही विधि कार्यान्वयन के लिए भेजा जा सकता।

वहाँ \ codeplex पर कुछ प्रासंगिक विचार विमर्श सा। जैसे

https://typescript.codeplex.com/workitem/617

मुझे अभी भी लगता टाइपप्रति सभी if'ing उत्पन्न करनी चाहिए और इसलिए हम यह करने के लिए की जरूरत नहीं होगी स्विच करना।

20/07/2013 को 15:11
का स्रोत उपयोगकर्ता

वोट
2

जावास्क्रिप्ट अधिक भार के किसी भी अवधारणा नहीं है। टाइपप्रति सी # या जावा नहीं है।

लेकिन तुम टाइपप्रति में अधिक भार लागू कर सकते हैं।

इस पोस्ट पढ़ें http://www.gyanparkash.in/function-overloading-in-typescript/

08/12/2018 को 06:15
का स्रोत उपयोगकर्ता

वोट
1

उपयोग करने के लिए नहीं क्यों वैकल्पिक संपत्ति से परिभाषित इंटरफेस समारोह तर्क के रूप में ..

इस सवाल के मामले में, एक इनलाइन इंटरफेस कुछ वैकल्पिक गुणों के साथ परिभाषित का उपयोग कर केवल सीधे नीचे कुछ की तरह कोड बना सकता है के लिए:

class TestClass {

    someMethod(arg: { stringParameter: string, numberParameter?: number }): void {
        let numberParameterMsg = "Variant #1:";
        if (arg.numberParameter) {
            numberParameterMsg = `Variant #2: numberParameter = ${arg.numberParameter},`;
        }
        alert(`${numberParameterMsg} stringParameter = ${arg.stringParameter}`);
    }
}

var testClass = new TestClass();
testClass.someMethod({ stringParameter: "string for v#1" });
testClass.someMethod({ numberParameter: 12345, stringParameter: "string for v#2" });

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

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

10/12/2017 को 15:12
का स्रोत उपयोगकर्ता

वोट
0
class User{
   name : string;
   age : number;
   constructor(name:string,age:number){
    this.name = name;
    this.age = age;
    console.log("User " +this.name+ " Created")
}
getName(name:string = ""):string{
    if(name != ""){
        return name + " " +this.name;
    }else{
        return this.name;
    }
  }

}

मुझे लगता है कि यह काम करना चाहिए

28/06/2017 को 05:50
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more