VB的に覚える TypeScript その7 〜 Visual Studio 2015

  • 2017.03.22 Wednesday
  • 21:52

 

クラスが出てきたので、構造体の話をしてみるが、

どうやらJSにそういったものがないので、TSにもないようだ。

 

いや、そもそも、VBやC#の構造体は、

参照型(クラス)か、値型(構造体)かの違いで、書き方などはほぼ同じもので、

前回書いたFruitクラスは Class を Structure に変更するだけで構造体にできる。

 

今回はTSの話なので、細かいところは他力ちゃんするが、

 

参照

クラスと構造体の使い分け

クラスまたは構造体の選択

 

VBでいうところの構造体は、TSではクラスで考えた方がよい。

 

 

では、構造体のようなものは本当に作れないのか

 

VB.netではなく、VB6やVBA、C言語の頃の構造体を思い出してみると、

値をまとめたモノを定義することはできた。

 

例えば、VB6やVBAなら Type を使って

 

   1:  Type Fruit
   2:    Name As String
   3:     Price As Integer
   4:  End Type

 

C言語なら struct を使って

 

   1:  struct Fruit{
   2:    char Name[256];
   3:     int  Price;
   4:  }

 

と書ける。

 

■TSで構造体(オブジェクトの型定義)

こういった形であれば、TSでも表現することができる。

 

   1:  namespace Yaoya {
   2:      export interface Fruit {
   3:          Name: string;
   4:          Price: number;
   5:      }
   6:  }

 

とinterfaceを使えばよい。

 

   1:  var newFruit: Yaoya.Fruit = { Name: "みかん", Price: 100 };
   2:   
   3:  alert(newFruit.Name + ":" + newFruit.Price);

 

 

ただし、実装している変数にもれなく値を入れる(初期化する)必要がある

 

 

ちなみに、インターフェイスの本来(?)の使い方は上のようなものではなく、

(上の使い方はオブジェクトの型定義などと言うようです)

 

例えば、長いことプログラムをゴリゴリ書いていると、

よく使う変数など、1つにまとめられるようなものが出てくると思う。

 

そういったものを1つにまとめた部品として、つまりinterfaceで定義しておくことで、

これから新たに作る際、生産性を上げることができる。

(間違いを少なくすることもできる)

 

クラスに似ているが、インターフェイスはあくまで定義が書かれただけのものになる。

 

逆に考えると、オブジェクトの型定義を1つの変数として値を渡すことができるので、

必ず必要なパラメータを渡したりするときは代入や取得のミスを少なくすることもできたりする。

 

細かいところは他力ちゃんします。

 

連載! とことん VB: 第 17 回 クラスの多重継承とその代替案

オブジェクトをつなぐためのインターフェイス

Typescriptのinterfaceの使い方

 

 

■interfaceを継承する

他力ちゃんですが、interfaceを継承したクラスを書いてみると

だいたいこんな感じになる。

 

   1:  namespace Yaoya {
   2:   
   3:      export interface IName {
   4:          Name: string;
   5:          Price: number;
   6:      }
   7:   
   8:      export interface ISanchi {
   9:          Sanchi: string;
  10:      }
  11:      
  12:      class Yasai implements IName {
  13:          Name: string;
  14:          Price: number;
  15:          Sendo: number;
  16:      }
  17:   
  18:      class Fruit implements IName, ISanchi {
  19:          Name: string;
  20:          Price: number;
  21:          Sanchi: string;
  22:   
  23:          private _Toudo: number;
  24:          
  25:          get Toudo(): number {
  26:              return this._Toudo;
  27:          }
  28:     
  29:          set Toudo(value: number) {
  30:              this._Toudo = value;
  31:          }
  32:      }
  33:  }
  34:   
  35:  namespace Sakanaya {
  36:      
  37:      interface ISendo {
  38:          Sendo: number;
  39:      }
  40:   
  41:      class Gyokai implements Yaoya.IName, Yaoya.ISanchi, ISendo {
  42:          Name: string;
  43:          Price: number;
  44:          Sanchi: string;
  45:          Sendo: number;
  46:      }    
  47:  }

 

interfaceをいくつか定義して、

Yasaiクラスのように継承したいinterfaceをimplementsで定義して書いてみたり、

 

Fruitクラスのように、複数のinterfaceを継承したり、

クラス独自の変数を定義したり、

 

namespaceでやおやとさかなやに別けて、

interfaceをexportすることで、別のnamespaceでも使用したりできる。

 

なお、interfaceは定義を継承する形となるので、

定義された変数やメソッドを実装していないと警告がでる。

 

 

 

継承できる点でクラスに似ているところはあるが、

何かを定義する(まとめる)というのは、

ある程度ゴリゴリ書いてからでないと、それをすることが難しいと思うので、

interfaceを継承する場面がどのくらいあるのか疑問である。

 

むしろinterfaceは上に書いたオブジェクトの型定義として使った方がよいかなと思う。

(ゴリゴリ書ける人はどんどん使った方がよいでしょう)

 

ザックリですがこんなところ。

 

 

関連記事

VB的に覚える TypeScript その1 〜 Visual Studio 2015

VB的に覚える TypeScript その2 〜 Visual Studio 2015

VB的に覚える TypeScript その3 〜 Visual Studio 2015

VB的に覚える TypeScript その4 〜 Visual Studio 2015

VB的に覚える TypeScript その5 〜 Visual Studio 2015

VB的に覚える TypeScript その6 〜 Visual Studio 2015

 

 

HTMLアプリのデバッグができない?〜VS2015 + HTMLアプリケーション

XAMLデザイナーのデザインビューが表示されない?〜Visual Studio 2015

 

コメント
コメントする








    
この記事のトラックバックURL
トラックバック

calendar

S M T W T F S
   1234
567891011
12131415161718
19202122232425
2627282930  
<< November 2017 >>

search this site.

よく使う、検索される投稿

categories

アマゾン

楽天

selected entries

archives

recent comment

recent trackback

profile


※当ブログはリンクフリーですが、 取材や雑誌等で掲載される場合は、事前にお知らせください

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM