Jak zrobić klasa wdrożenia podpisu rozmowę na maszynie?

głosy
26

I zostały zdefiniowane następujące interfejs w maszynopisie:

interface MyInterface {
    () : string;
}

Ten interfejs po prostu wprowadza podpis połączenia, które ma żadnych parametrów i zwraca ciąg znaków. Jak zaimplementować tego typu w klasie? Próbowałem z następujących powodów:

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

Kompilator powtarza mi, że

Klasy MyType 'deklaruje interfejsu „MyInterface”, ale nie implementuje go: Type „MyInterface” wymaga podpisu rozmowę, ale typu „MyType” brakuje jednego

W jaki sposób można wdrożyć podpis połączeń?

Utwórz 07/10/2012 o 15:22
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
11

Klasy nie można dopasować tego interfejsu. Najbliżej można dostać, myślę, że jest to klasa, która będzie generować kod, który funkcjonalnie odpowiada interfejs (ale nie w zależności od kompilatora).

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

To wygeneruje kod działa, ale kompilator będzie narzekać, że MyTypenie jest wymagalne, ponieważ ma sygnaturę new() = 'string'(choć jeśli nazywają go new, zwróci obiekt).

Aby stworzyć coś, co actally odpowiada interfejs bez narzekania kompilatora, musisz zrobić coś takiego:

var MyType = (() : MyInterface => {
  return function() { 
    return "Hello"; 
  }
})();
alert(MyType());
Odpowiedział 07/10/2012 o 16:32
źródło użytkownik

głosy
4

Przykłady kodu w tej odpowiedzi zakładają następujące oświadczenie:

var implementation: MyInterface;

Zapewnienie wdrożenia na żądanie interfejsu

W następstwie przyjętej odpowiedź , jak sugerują niektóre jego commentors, funkcji, która pasuje podpis wywołania interfejsu użytkownika niejawnie implementuje interfejs. Tak więc można użyć dowolnej funkcji dopasowania jako realizacji.

Na przykład:

implementation = () => "Hello";

Nie trzeba wyraźnie określić, że funkcja implementuje interfejs. Jednakże, jeśli chcesz być jawne, można użyć obsady:

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

Zapewnienie realizacji wielokrotnego użytku

Jeśli chcesz produkować wielokrotnego użytku implementacji interfejsu jak ty normalnie z # interfejs Java lub C, po prostu gdzieś przechowywać funkcję dostępną dla swoich konsumentów.

Na przykład:

function Greet() {
    return "Hello";
}

implementation = Greet;

Zapewnienie parametryzowany realizację

Możesz być w stanie sparametryzuj wdrożenie w taki sam sposób, że może parametryzacji klasę. Oto jeden ze sposobów, aby to zrobić:

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

implementation = MakeGreeter("Hello");

Jeśli chcesz być wynikiem wpisane jako interfejs, tylko jawnie ustawić typ zwracanej lub rzucać wartość jest zwracana.

Odpowiedział 23/12/2013 o 02:45
źródło użytkownik

głosy
1

W przypadku, gdy wymagalne interfejs powinien mieć inne metody można to zrobić tak:

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!'

Wada: greeter instanceof ConsoleGreeterjestfalse

Odpowiedział 25/01/2018 o 08:08
źródło użytkownik

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