インターフェイス　Javaの問題をTypeScriptにしてみる  7-3

**インターフェースに関する説明として正しいものを選びなさい。(２つ)**

A.アクセス修飾子を省略してもpublicなメソッドとして扱われる。
B.フィールドは一切定義できない。
C.クラスは複数のインタフェースを同時に実現できない。
D.インタフェースを継承することはできない。
E.抽象クラスは、インタフェースに定義されているメソッドを実現しなくても良い

答えは**AE**

A.アクセス修飾子を省略してもpublicなメソッドとして扱われる。
　　・・・正解、インターフェイスにはprotectedやprivateを使うことはできない。
B.フィールドは一切定義できない。
　　・・・不正解、JAVASE8からの仕様でfinalとstaticを使うことによって可能となった。
C.クラスは複数のインタフェースを同時に実現できない。
　　・・・不正解、javaのインターフェイスはc++のひし形継承などの継承の問題を解決するためにあります。クラスが多重継承を禁止している代わりにインターフェイスではそれが許されています。
D.インタフェースを継承することはできない。
　　・・・不正解、インターフェイスを継承することは可能です。
E.抽象クラスは、インタフェースに定義されているメソッドを実現しなくても良い
　    ・・・正解、それらを継承し、最終的に実態化されるインスタンスに全て入って入れば問題ない。







これをTypeScriptにして考えて見ます。

**A.アクセス修飾子を省略してもpublicなメソッドとして扱われる。**
 jsではアクセス修飾子を省略した場合javaでいう所のpublicな扱いを受けます。
typescriptはjsと互換性を持たせているため、同じようにアクセス修飾子の省略はどこからでもアクセスできる状態となります。







**B.フィールドは一切定義できない。**



```ts:typescript.ts
interface MyInterface{
    name:string
}
class MyClass implements MyInterface{
     name:string;//このメンバーがない場合コンパイルエラーとなる。
     constructor(name: string) {
          this.name = name; 
     }
}
var obj:MyClass = new MyClass("masao");
var str:string = obj.name;
console.log(str);//masaoと表示
```




コンパイル後

```ts:typescript.ts
var MyClass = (function () {
    function MyClass(name) {
        this.name = name;
    }
    return MyClass;
}());
var obj = new MyClass("masao");
var str = obj.name;
console.log(str); //masaoと表示
```
フィールドを指定しても正常にコンパイルをすることが可能です。




**C.クラスは複数のインタフェースを同時に実現できない。**

```ts:TypeScript.ts
interface MyInterface{
    name:string;
}
interface MyInterface2{
     family:string;
}
class MyClass implements MyInterface,MyInterface2{
     name:string;//このメンバーがない場合コンパイルエラーとなる。
     family:string;//このメンバーがない場合コンパイルエラーとなる。
     constructor(name: string,family: string) {
          this.name = name; 
          this.family = family; 
     }
}
var obj:MyClass = new MyClass("masao","yamda");
var str:string = obj.name + obj.family;
console.log(str);//masaoyamadaと表示
```





コンパイル後

```js:javascript.js
var MyClass = (function () {
    function MyClass(name, family) {
        this.name = name;
        this.family = family;
    }
    return MyClass;
}());
var obj = new MyClass("masao", "yamda");
var str = obj.name + obj.family;
console.log(str); //masaoyamadaと表示
```

複数のインターフェイスを実現しても正常にコンパイルを通すことができます。

**D.インタフェースを継承することはできない。**

```ts:typeScript

interface MyInterface{
    name:string;
}
interface MyInterface2 extends MyInterface{
     family:string;
}

class MyClass implements MyInterface2{
     name:string;//このメンバーがない場合コンパイルエラーとなる。
     family:string;//このメンバーがない場合コンパイルエラーとなる。
     constructor(name: string,family: string) {
          this.name = name; 
          this.family = family; 
     }
}

var obj:MyClass = new MyClass("masao","yamda");
var str:string = obj.name + obj.family;
console.log(str);//masaoyamadaと表示
```



コンパイル後

```js:JavaScript.js

var MyClass = (function () {
    function MyClass(name, family) {
        this.name = name;
        this.family = family;
    }
    return MyClass;
}());
var obj = new MyClass("masao", "yamda");
var str = obj.name + obj.family;
console.log(str); //masaoyamadaと表示
```
インターフェイスが継承をしても問題なくコンパイルが通ります。




**E.抽象クラスは、インタフェースに定義されているメソッドを実現しなくても良い**
TypeScriptには抽象クラスはありません。