Metoda přetížení?

hlasů
75

Existuje způsob, jak metodu přetížení na stroji jazyka?

Chci dosáhnout něčeho takového:

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

Zde je příklad toho, co nechci dělat (opravdu jsem, že část přetěžování hack v JS nenávidím):

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);
Položena 02/10/2012 v 11:03
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
107

Podle specifikace, strojopisem dělá způsob podpory přetížení, ale je to docela trapné a obsahuje spoustu manuální práce kontroly typy parametrů. Myslím, že je to hlavně proto, že nejblíže se můžete dostat do způsobu přetížení v prostém JavaScriptu patří, že kontrola a taky strojopisem snaží se nemění skutečné metody orgány, aby se zabránilo zbytečným nákladům výkonu runtime.

Mám-li to správně pochopili, musíte nejprve napsat prohlášení metodu pro každou z přetížení a pak jedna implementace metoda, která kontroluje její argumenty se rozhodnout, které přetížení byl nazýván. Podpis realizace musí být kompatibilní se všemi přetížení.

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);
    }
}
Odpovězeno 02/10/2012 v 12:00
zdroj uživatelem

hlasů
18

Aktualizace pro přehlednost. Metoda přetížení na stroji je užitečná vlastnost, pokud to umožňuje vytvořit definice typu pro existující knihovny s API, které musí být zastoupeny.

Při psaní vlastního kódu, i když, můžete také být schopen vyhnout kognitivní režii přetížení pomocí volitelného nebo výchozí parametry. To je čitelnější alternativou k metodě přetížení a také udržuje váš API upřímný, jak budete vyhnout vytváření přetížení s unintuitive objednání.

Obecný zákon strojopisem přetížení je:

Pokud můžete smazat podpisy přetížení a všechny vaše testy projít, nemusíte strojopisem přetížení

Obvykle můžete dosáhnout totéž s volitelným nebo výchozích parametrů - nebo s typy unií nebo s trochou objektové orientace.

Skutečná otázka

Skutečná otázka se ptá na přetížení:

someMethod(stringParameter: string): void {

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

Nyní dokonce v jazycích, které podporují přetížení se samostatnými implementacemi (Poznámka: strojopisem přetížení sdílet jediné implementaci) - programátoři jsou rady S cílem zajistit soulad v objednávce. To by podpisy:

someMethod(stringParameter: string): void {

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

stringParameterJe vždy potřeba, tak to jde jako první. Dalo by se napsat to jako pracovní přetížení strojopisem:

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

Ale po právu strojopisu přetížení, můžeme odstranit podpisy přetížení a všechny naše testy ještě projít.

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

Skutečná otázka, v samotném Řádu

Pokud jste byli odhodláni vytrvat s původním pořadí, přičemž přetížení bude vypadat následovně:

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

Nyní, když je hodně větvení vymyslet, kam umístit parametry, ale opravdu chtěl zachovat tuto objednávku, pokud čtete tento daleko ... ale počkat, co se stane, pokud budeme uplatňovat zákon strojopisem přetížení?

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

Dost větvení Již

Samozřejmě, že vzhledem k množství typové kontroly musíme udělat ... možná nejlepší odpovědí je prostě mít dvě metody:

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

someOtherMethod(numberParameter: number, stringParameter: string): void {
  //...
}
Odpovězeno 02/10/2012 v 11:16
zdroj uživatelem

hlasů
7

Přeji si. Chci tuto funkci příliš, ale na psacím stroji musí být interoperabilní se bez definovaného typu JavaScript, která nemá přetížené metody. tj Je-li přetížení metoda volána z JavaScriptu pak to může jen získat odeslány do jedné implementaci metody.

Tam \ sa málo relevantní diskusi o CodePlex. např

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

Pořád si myslím, strojopisem by měly vytvářet všechny if'ing a přepínací takže by nebylo nutné to udělat.

Odpovězeno 20/07/2013 v 15:11
zdroj uživatelem

hlasů
2

Javascript nemá žádnou představu o přetížení. Strojopisem není c # nebo Java.

Ale můžete implementovat přetížení na psacím stroji.

Přečtěte si tento příspěvek http://www.gyanparkash.in/function-overloading-in-typescript/

Odpovězeno 08/12/2018 v 06:15
zdroj uživatelem

hlasů
1

Proč nepoužívat fakultativní majetku definované rozhraní jako argument funkce ..

Pro případ v této otázce, s použitím vložené rozhraní definované s některými volitelnými vlastnostmi jen mohl přímo, aby kód, jako něco níže:

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

Vzhledem k tomu, přetížení uvedené v strojopis, jak je uvedeno v komentáři druhých, jen seznam funkcí v různých podpisů bez podložky příslušného prováděcího kódy jako ostatní statické jazyky. Takže implementace ještě musí být provedeno pouze v jednom těle funkce, která umožňuje využití funkce přetížení na stroji není tak pohodlné jako takové jazyky, které podporují reálnou funkci přetížení.

Nicméně stále existuje mnoho nových a pohodlné výrobky uvedené na stroji, který není k dispozici ve starších programovacího jazyka, kde volitelná podpora nemovitost v anonymním rozhraní je takový přístup ke splnění komfortní zónu ze starší funkce přetížení, myslím.

Odpovězeno 10/12/2017 v 15:12
zdroj uživatelem

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

}

Myslím, že by to mělo fungovat

Odpovězeno 28/06/2017 v 05:50
zdroj uživatelem

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