Interface
Interfaceってなんだ!
何が出来るのかだけを表すヤツ
例
犬クラスであれば吠えさせることが出来る ご飯をあげることができる 撫でられる などがインターフェース
Animal を継承した Dog がインターフェース IBarkable IDogfoodable IStrokable を実装するなど
ポリモーフィズム
同じインターフェースを継承しているなら同じものとして使える!
Animalを継承していないRobotDogがいたとする
IBarkable IStrokableを持つ
ご飯はあげられない
なんでも良いから撫でたい!!
code: IUpdatable.cs
// 更新可能なやつ
public interface IUpdatable
{
public void Update();
}
code: なんでも良いから撫でるマン.cs
public class なんでもいいから撫でるマン : IUpdatable
{
private IStrokable _strokable;
// コンストラクタ
public なんでもいいから撫でるマン(IStrokable strokable)
{
_strokable = strokable;
}
// 更新処理のたびに撫でられるものを撫でる
public void Update()
{
_strokable.Stroke();
}
}
なんでも良いから撫でるマンの母親
code: なんでも良いから撫でるマンの親.cs
public class なんでも良いから撫でるマンの母親 : MonoBehaviour
{
// 相手について詳しく知らなくてもいいので、「更新可能なやつ」として子供を扱う
private IUpdatable _updatable;
public void Start()
{
// 子供が生まれるから予めロボット犬を買っておきました
var robotDog = new RobotDog();
// 元気な男の子です!!
_updatable = new なんでもいいから撫でるマン(robotDog);
}
public void Update()
{
// 更新処理を呼ぶ
// よく知らないけどなんか犬を撫でてるっぽい
_updatable.Update();
}
}
Interfaceと継承の違い
Interfaceは実装を持たない
複数個のInterfaceを実装することができる
DIへの誘い
この時点ですでにDIはできてる
この例でのなんでも良いから撫でるマン は相手の 撫でられるやつ に対して依存していない状態を保てている
親の気分次第で やっぱロボット犬はかわいくないから普通の犬にするわ といった変更もできる
なんでも良いから撫でるマン が内部で RobotDog をnew、もしくは検索してしまったら、それはDIに失敗している状態
インターフェースでのアクセスを徹底すると、みんなの親 がひたすらnewしまくってコンストラクタ差し込みまくる人になってしまう
みんなの親がカオスになるので、それを黒魔術で解決したのがDIコンテナ