インデクサ使って実装できたらかっこいい気がするなーと思ったのでちょっとだけ調べてみました。
##インデクサとは?
インデクサ = indexer
インデクサを使うとオブジェクトを配列やListのように扱うことができるようになります。
インデクサはプロパティと似ている。
こんな感じでデータにアクセスできるようになります。
MonsterManager manager = new MonsterManager ();
var monster = manager [0, "hoge"];
var monster2 = manager [0];
##実装コード
インデクサを実装しているMonsterManager
using System.Collections.Generic;
using System;
using UnityEngine;
public class MonsterManager
{
[SerializeField]
private List<Monster> monsterList = new List<Monster> ();
public MonsterManager ()
{
monsterList.Add (new Monster ("くっぱ"));
monsterList.Add (new Monster ("すらいむ"));
monsterList.Add (new Monster ("とろーる"));
}
public Monster this [int index] {
get {
return monsterList [index];
}
set {
monsterList.Add (value);
}
}
[Serializable]
public class Monster
{
public Monster (string name)
{
Name = name;
}
public int Hp {
get;
set;
}
public int Atk {
get;
set;
}
public string Name {
get;
set;
}
public override string ToString ()
{
return "Monster:" + Name;
}
}
}
インデクサを使ってMonsterにアクセス
void Start ()
{
MonsterManager manager = new MonsterManager ();
var monster = manager [0];
Debug.Log (monster.ToString ());
}
なんかちょっとかっこいい
##インデクサの実装方法
基礎文法
要素型 this[int index]
{
get
{
return 要素[index];
}
set
{
要素.add(value);
}
}
- インデクサに名前をつけることはできません。
- getでは要素型を返す必要があります。
- setでは要素型のvalue変数が渡ってきます。
- this[int index]の**[int index]**はintである必要はありません。別の型でOKですし、2つ以上あっても大丈夫です。
- インデクサは
オーバーライドオーバーロード(間違えちゃいけない;;)することができます。
2種類のインデクサを実装することも可能
public Monster this [int index, string name] {
get {
return monsterList [index];
}
set {
monsterList.Add (value);
}
}
public Monster this [int index] {
get {
return monsterList [index];
}
set {
monsterList.Add (value);
}
}
インデクサを使ってアクセス
MonsterManager manager = new MonsterManager ();
var monster = manager [0, "hoge"];
var monster2 = manager [0];
うーん、かっこいい。
が、使い慣れていないと混乱を生む可能性がたかいな