Módszer túlterhelés?

szavazat
75

Van egy módja annak, hogy nem a módszer túlterhelés géppel nyelven?

Azt szeretnék elérni, valahogy így:

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);

Itt egy példa, amit én nem akarok (nagyon utálom azt a részét, túlterhelés hack JS):

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);
A kérdést 02/10/2012 11:03
a forrás felhasználó
Más nyelveken...                            


6 válasz

szavazat
107

A leírás szerint, géppel nem támogatja módszer túlterhelés, de elég kényelmetlen, és tartalmaz egy csomó kézi munka ellenőrzése típusú paraméterek. Azt hiszem, ez leginkább azért, mert a legközelebb akkor kap a módszer túlterhelés egyszerű JavaScript tartalmaz, amely ellenőrzi is, és géppel igyekszik nem módosítja azt a módszert szervek, hogy elkerülhető legyen a szükségtelen futási költségeit.

Ha jól értem, akkor az első levelet metódus az egyes túlterhelés, majd az egyik módszer végrehajtását, amely ellenőrzi az érveit, hogy melyik túlterhelés hívták. Az aláírás a végrehajtás kompatibilisnek kell lennie minden a túlterhelés.

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);
    }
}
Válaszolt 02/10/2012 12:00
a forrás felhasználó

szavazat
18

Frissítse az egyértelműség kedvéért. Módszer túlterhelés géppel egy hasznos funkció, amennyiben ez lehetővé teszi, hogy típusdefiníciókat meglévő könyvtárak egy API kell képviselni.

Amikor saját kód írásával, bár akkor is el tudják kerülni a kognitív overhead túlterhelés opcionális vagy alapértelmezett paraméterekkel. Ez annál is olvasható alternatív módszer túlterhelés, emellett a API őszinte, mint akkor elkerülhető legyen túlterhelés unintuitive rendelés.

Az általános gyakorlat az írógéppel túlterheli a következő:

Ha törölheti a túlterhelés aláírások és az összes teszt sikeres, akkor nem kell géppel túlterhelés

Akkor általában elérni ugyanezt opcionális, vagy az alapértelmezett paramétereket - vagy szakszervezeti típusú, vagy egy kis tárgy-orientáció.

A tényleges kérdés

A tényleges kérdés kér túlterhelése:

someMethod(stringParameter: string): void {

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

Most még a nyelv, amely támogatja a túlterhelés külön megvalósítások (megjegyzés: géppel túlterhelés megosztani egy végrehajtás) - programozók tanácsok, hogy összhangot a rendelés. Ez lehetővé tenné az aláírások:

someMethod(stringParameter: string): void {

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

A stringParametermindig kötelező, ez így megy először. Írhatsz ez egy működő géppel túlterhelés:

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

De a következő törvénye géppel túlterhelés, törölhetjük a túlterhelés aláírások és minden tesztben még át.

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

A tényleges kérdés, az aktuális rendelés

Ha meghatároztuk megmaradnak az eredeti rend, a túlterhelés lenne:

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;
    }
  }
}

Most, hogy egy csomó elágazás, hogy dolgozzanak ki, hogy hova tegye a paramétereket, de igazán akarta őrizni ezt a sorrendet, ha ezt olvasod, amennyire ... de várjunk csak, mi történik, ha alkalmazzák a törvény a géppel túlterhelés?

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;
    }
  }
}

Elég elágazás már

Természetesen, mivel az összeg a típusellenőrzés tennünk kell ... talán a legjobb válasz az, hogy egyszerűen két módszer:

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

someOtherMethod(numberParameter: number, stringParameter: string): void {
  //...
}
Válaszolt 02/10/2012 11:16
a forrás felhasználó

szavazat
7

Kívánom. Szeretném ezt a lehetőséget is, de géppel kell együttműködjön típustalan JavaScript amely nem túlterhelt módszereket. vagyis Ha a túlterhelt metódust a JavaScript akkor csak kap szállítanak egyik módszer végrehajtását.

Ott \ sa kevés releváns viták codeplex. például

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

Még mindig úgy gondolom géppel kell generálni az összes if'ing és kapcsol, így nem lenne szükség rá.

Válaszolt 20/07/2013 15:11
a forrás felhasználó

szavazat
2

Javascript nincs fogalma a túlterhelés. Géppel nem c # vagy Java.

De akkor végre túlterhelés géppel.

Olvasd el ezt a bejegyzést http://www.gyanparkash.in/function-overloading-in-typescript/

Válaszolt 08/12/2018 06:15
a forrás felhasználó

szavazat
1

Miért nem használja kötelező tulajdonság definiált interfészen függvényében érv ..

Abban az esetben, ebben a kérdésben, amihez inline felület meghatározott egyes választható tulajdonságokat csak közvetlenül tudta tenni kódot, mintha alább:

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" });

Mivel túlterhelés feltéve géppel is, ahogy azt mások megjegyzéseire, csak egy lista függvény különböző aláírások nélkül támogató megfelelő végrehajtása kódokat, mint más statikus nyelven. Tehát a végrehajtás továbbra is el kell végezni csak egy funkciót, ami növeli a használat függvényében túlterhelés géppel nem olyan kényelmes, mint olyan támogató nyelvek az igazi túlterhelés funkciót.

Azonban még mindig sok új és kényelmes töm előírt géppel, amely nem áll rendelkezésre régebbi programozási nyelv, ahol nem kötelező tulajdonság támogatás egy névtelen felület egy ilyen megközelítés, hogy megfeleljen a kényelmes terület a régebbi funkció túlterhelés, azt hiszem.

Válaszolt 10/12/2017 15:12
a forrás felhasználó

szavazat
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;
    }
  }

}

Azt hiszem, ez kell működnie

Válaszolt 28/06/2017 05:50
a forrás felhasználó

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