Πώς να κάνει μια τάξη εφαρμόσει μια υπογραφή κλήση σε γραφομηχανή;

ψήφοι
26

Έχω ορίζονται τα εξής διασύνδεση με τυπογραφικούς χαρακτήρες:

interface MyInterface {
    () : string;
}

Αυτή η διεπαφή εισάγει απλώς μια υπογραφή κλήση που δεν λαμβάνει τις παραμέτρους και επιστρέφει ένα string. Πώς μπορώ να εφαρμόσουν αυτό το είδος σε μια τάξη; Έχω δοκιμάσει τα εξής:

class MyType implements MyInterface {
    function () : string {
        return Hello World.;
    }
}

Ο συντάκτης διατηρεί λέγοντάς μου ότι

Κατηγορία «MyType» δηλώνει περιβάλλον «MyInterface», αλλά δεν την εφαρμόζουν: Τύπος «MyInterface» απαιτεί μια υπογραφή κλήση, αλλά Τύπος «MyType» στερείται ένα

Πώς μπορώ να εφαρμόσω την υπογραφή κλήση;

Δημοσιεύθηκε 07/10/2012 στις 15:22
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
11

Μαθήματα δεν μπορεί να ταιριάξει με αυτό το περιβάλλον. Το πιο κοντινό μπορείτε να πάρετε, νομίζω ότι είναι αυτή η τάξη, η οποία θα δημιουργήσει κώδικα που ταιριάζει με λειτουργικά το περιβάλλον (αλλά όχι σύμφωνα με τον compiler).

class MyType implements MyInterface {
  constructor {
    return "Hello";
  }
}
alert(MyType());

Αυτό θα δημιουργήσει κώδικα εργασίας, αλλά ο compiler θα παραπονεθεί ότι MyTypeδεν είναι δυνατό να εξοφληθεί πρόωρα επειδή έχει την υπογραφή new() = 'string'(ακόμα κι αν το call με new, θα επιστρέψει ένα αντικείμενο).

Για να δημιουργήσουμε κάτι που να ταιριάζει με actally το περιβάλλον χωρίς παράπονα compiler, θα πρέπει να κάνουμε κάτι σαν αυτό:

var MyType = (() : MyInterface => {
  return function() { 
    return "Hello"; 
  }
})();
alert(MyType());
Απαντήθηκε 07/10/2012 στις 16:32
πηγή χρήστη

ψήφοι
4

Τα παραδείγματα κώδικα σε αυτήν την απάντηση αναλάβει την ακόλουθη δήλωση:

var implementation: MyInterface;

Παρέχοντας μια εφαρμογή απαιτητών διεπαφής

Ως συνέχεια της την αποδεκτή απάντηση , όπως προτείνεται από ορισμένα από τα commentors της, μια λειτουργία που ταιριάζει με την υπογραφή κλήση της διεπαφής υλοποιεί έμμεσα το περιβάλλον. Έτσι, μπορείτε να χρησιμοποιήσετε οποιαδήποτε λειτουργία αντιστοίχισης ως εφαρμογή.

Για παράδειγμα:

implementation = () => "Hello";

Δεν χρειάζεται να ορίσετε ρητά ότι η λειτουργία υλοποιεί το περιβάλλον. Ωστόσο, αν θέλετε να είναι ρητή, μπορείτε να χρησιμοποιήσετε ένα καστ:

implementation = <MyInterface>() => "Hello";

Παρέχοντας ένα επαναχρησιμοποιήσιμο εφαρμογή

Αν θέλετε να παράγει μια επαναχρησιμοποιήσιμη εφαρμογή της διεπαφής, όπως θα κάνατε κανονικά με Java ή C # interface, απλά αποθηκεύει τη λειτουργία κάπου προσιτή στους καταναλωτές της.

Για παράδειγμα:

function Greet() {
    return "Hello";
}

implementation = Greet;

Η παροχή ενός παραμετροποιηθούν εφαρμογή

Μπορεί να θέλετε να είναι σε θέση να παραμετροποιήσετε την εφαρμογή με τον ίδιο τρόπο που μπορείτε να παραμετροποιήσετε μια τάξη. Εδώ είναι ένας τρόπος για να γίνει αυτό:

function MakeGreeter(greeting: string) {
    return () => greeting;
}

implementation = MakeGreeter("Hello");

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

Απαντήθηκε 23/12/2013 στις 02:45
πηγή χρήστη

ψήφοι
1

Σε περίπτωση απαιτητών διεπαφή θα πρέπει να έχουν και άλλες μέθοδοι που μπορείτε να το κάνετε ως εξής:

interface Greeter {
    (): void;
    setName(name: string): void;
}

class ConsoleGreeter {

    private constructor( // constructable via `create()`
        private name = 'world'
    ) {}

    public call(): void {
        console.log(`Hello ${this.name}!`);
    }

    public setName(name: string) {
        this.name = name;
    }

    public static create(): Greeter {
        const instance = new ConsoleGreeter();
        return Object.assign(
            () => instance.call(),
            {
                setName: (name: string) => instance.setName(name)
                // ... forward other methods
            }
        );
    }
}

const greeter = ConsoleGreeter.create();
greeter.setName('Dolly');
greeter(); // prints 'Hello Dolly!'

Μειονέκτημα: greeter instanceof ConsoleGreeterείναιfalse

Απαντήθηκε 25/01/2018 στις 08:08
πηγή χρήστη

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