アリスムカイデが“MV女優”になった原点MVをご紹介!

すみません。教えてください。
例えば以下のプログラム構文があったとすると、
Grassのインスタンスの中でJuice型のインスタンスも参照先として管理して使うという理解で良いでしょうか?

Grass<Juice> g = new Grass<Juice>();

A 回答 (2件)

> Grassのインスタンス化するのと同時に


> Juiceというクラスをnewでインスタンス化
> して使うのとはダメでしょうか?
> あくまでもGrassのインスタンス化処理の中で
> Juiceも使えるようにするということでしょうか。

Juiceというクラスなどを有するもののみを受け付けるというだけであって、インスタンス化は別問題です。

例えばJuiceというクラス1つだけをどうこうしたいのならば、いちいちジェネリクスを使う意味がありません。
内部でJuiceクラスをインスタンス化すればいい話です。

例えばJuiceはインターフェースであり、AppleJuice、OrangeJuiceというクラスがあった時、以下のような使い方ができます。
Juiceインターフェースを実装しているAppleJuice、OrangeJuiceを渡し、Grass内でインスタンス化を行い、あるメソッドでJuiceインターフェースの操作を行う。
interface Juice
{
string Type { get; }
string Value { get; set; }
}

class AppleJuice : Juice
{
public string Type => "Apple Juice";
public string Value { get; set; }
}

class OrangeJuice : Juice
{
public string Type => "Orange Juice";
public string Value { get; set; }
}

class Grass<T> where T : Juice, new()
{
private T juice = new T();

public T Get()
{
return juice;
}

public T Hoge()
{
var juice = new T();
juice.Value = juice.GetType().ToString();
return juice;
}
}

private void button1_Click(object sender, EventArgs e)
{
var grass1 = new Grass<AppleJuice>();
var juice1 = grass1.Get();
Console.WriteLine(juice1.Type);
var juice2 = grass1.Hoge();
Console.WriteLine(juice2.Value);

var grass2 = new Grass<OrangeJuice>();
var juice3 = grass2.Get();
Console.WriteLine(juice3.Type);
var juice4 = grass2.Hoge();
Console.WriteLine(juice4.Value);
}

[実行結果]
Apple Juice
WindowsFormsApp1.AppleJuice
Orange Juice
WindowsFormsApp1.OrangeJuice


ただ単一のJuiceクラスをGrassクラス内でインスタンス化するものとの違いは、
下記でしょう。
・指定したクラス(AppleJuice、OrangeJuice)を操作できる。

更に、上記だと正直わかりづらいですが、例えばGrassクラスのコンストラクタにJuiceインターフェースを仮引数として受け取る形にすればいいんじゃないの?
と思うかもしれません。
この場合、予め外部で、Juiceインターフェースを実装したクラスをインスタンス化しておく必要があります。
しかし、ジェネリクスにすると、指定したクラスを内部でインスタンス化して扱えるため、AppleJuice、OrangeJuiceが、外部からのインスタンス化が許可されておらず、Grassクラスを経由して初めて得られるもの、だとしたら有効ですね。
ジェネリクスでない時、Juiceインターフェースを戻り値にするメソッドは用意できますが、AppleJuice、OrangeJuiceクラスなどの任意のクラスを戻り値にするメソッドは用意できません。

他に、AppleJuice、OrangeJuiceクラスは外部からのインスタンス化も可能だけど、Grassクラスの特定メソッドを呼び出すことで、特定の情報が設定されたAppleJuice、OracleJuiceインスタンスを得ることが出来る、ということも可能です。

ということで、ジェネリクスに指定するクラスが曖昧であると、ジェネリクスの効果が発揮されます。
    • good
    • 1

そうですかね。


Grassクラス内部で管理されるクラスは、Juiceクラスしか許可しない形になります。
だから質問にあるようなコードを書いた時、Grassクラスのメソッド/プロパティの作り方によっては、
引数/戻り値がJuiceクラスに制約されることになります。

使う時に感覚?は、List<string>, Dictionary<int, string>とかと一緒ですよ。
    • good
    • 0
この回答へのお礼

ありがとうございます。
Grassのインスタンス化するのと同時に
Juiceというクラスをnewでインスタンス化
して使うのとはダメでしょうか?
あくまでもGrassのインスタンス化処理の中で
Juiceも使えるようにするということでしょうか。

お礼日時:2018/08/08 21:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング