Μέθοδος υπερφόρτωση;

ψήφοι
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);

Εδώ είναι ένα παράδειγμα του τι δεν θέλω να κάνω (Πραγματικά σιχαίνομαι αυτό το μέρος της υπερφόρτωσης αμυχή στο 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);
Δημοσιεύθηκε 02/10/2012 στις 11:03
πηγή χρήστη
Σε άλλες γλώσσες...                            


6 απαντήσεις

ψήφοι
107

Σύμφωνα με τις προδιαγραφές, γραφομηχανή κάνει μέθοδος υποστήριξης υπερφόρτωση, αλλά είναι αρκετά δύσκολη και περιλαμβάνει πολλή χειρωνακτική εργασία ελέγχου τύπους παραμέτρων. Νομίζω ότι είναι ως επί το πλείστον, επειδή το πιο κοντινό μπορείτε να πάρετε με τη μέθοδο υπερφόρτωση με απλά την Javascript περιλαμβάνει ότι ο έλεγχος πάρα πολύ και γραφομηχανή προσπαθεί να μην τροποποιήσει την πραγματική φορείς μέθοδος για να αποφευχθεί κάθε περιττή δαπάνη των επιδόσεων runtime.

Αν κατάλαβα καλά, θα πρέπει πρώτα να γράψετε μια δήλωση μέθοδο για κάθε μία από τις υπερφορτώσεις και στη συνέχεια μια εφαρμογή η μέθοδος που ελέγχει τα επιχειρήματά της για να αποφασίσουν ποια υπερφόρτωση ονομαζόταν. Η υπογραφή της εφαρμογής πρέπει να είναι συμβατό με όλες τις υπερφορτώσεις.

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

Ενημέρωση για λόγους σαφήνειας. Μέθοδος υπερφόρτωση με γραφομηχανή είναι ένα χρήσιμο χαρακτηριστικό στο βαθμό που σας επιτρέπει να δημιουργήσετε ορισμούς τύπου για τις υπάρχουσες βιβλιοθήκες με ένα API που πρέπει να εκπροσωπούνται.

Όταν γράφετε το δικό σας κωδικό, όμως, μπορεί κάλλιστα να είναι σε θέση να αποφύγει τη γνωστική επιβάρυνση της υπερφόρτωσης με τον προαιρετικό ή προεπιλεγμένες παραμέτρους. Αυτό είναι το πιο ευανάγνωστο εναλλακτική λύση για τη μέθοδο υπερφόρτωση και κρατά API σας είμαι ειλικρινής, όπως θα αποφευχθεί η δημιουργία υπερφορτώσεις με unintuitive παραγγελία.

Ο γενικός νόμος της γραφομηχανή επιβαρύνει είναι:

Εάν μπορείτε να διαγράψετε τις υπογραφές υπερφόρτωση και το σύνολο των εξετάσεων σας περάσει, δεν χρειάζεται υπερφόρτωση γραφομηχανή

Συνήθως, μπορείτε να επιτύχετε το ίδιο πράγμα με το προαιρετικό ή προεπιλεγμένες παραμέτρους - ή με τύπους ένωση, ή με ένα κομμάτι του αντικειμένου-προσανατολισμό.

Η πραγματική ερώτηση

Το πραγματικό ερώτημα αφορά την υπερφόρτωση του:

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 την Javascript για τα οποία δεν έχει υπερφορτωθεί μεθόδους. δηλαδή Αν υπερφορτωμένο μέθοδος σας καλείται από τη Javascript τότε μπορεί μόνο να αποστέλλονται σε μία εφαρμογή της μεθόδου.

\ Υπάρχει μια λίγες σχετικές συζητήσεις για CodePlex. π.χ

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

Εξακολουθώ να πιστεύω γραφομηχανή θα πρέπει να δημιουργήσει όλες τις if'ing και μεταγωγής έτσι δεν θα χρειαστεί να το κάνει.

Απαντήθηκε 20/07/2013 στις 15:11
πηγή χρήστη

ψήφοι
2

Η Javascript δεν έχει καμία έννοια της υπερφόρτωσης. Γραφομηχανή δεν είναι γ # ή Java.

Αλλά μπορείτε να εφαρμόσετε υπερφόρτωση στη γραφομηχανή.

Διαβάστε αυτήν την ανάρτηση 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