4

私はまだ OO と C# に慣れていません。これは簡単な質問だと思います。答えはわかっていると思いますが、確認したいと思います。

と呼ばれるクラスと、から継承するCar別のクラスが呼び出され、そのクラスから継承されるさらに別のクラスが呼び出されるとします。FordCarMustangFord

オブジェクトのコレクションを受け入れるメソッドを作成し、Carそのメソッドを呼び出すと、実際にはオブジェクトであるため、そのメソッドにMustang(またはFord) オブジェクトのコレクションを渡すことは許容/可能Carですか?

Car私の考えでは、クラスの Properties\Methods にしかアクセスできないことを理解した上で、これは可能であるはずです。私はこれに基づいていませんか?

また、私が正しければ、これを行うことができます:メソッドの呼び出しでコレクションMustangをコレクションにキャストする必要がありますか?Car

4

4 に答える 4

5

いいえ、それは不可能です。

したがって、List<Car>型を受け入れる関数があるとします。Prius明らかに、その関数はそのリストにa を追加できるはずですよね? このメソッドにa を渡すことが許されていれば、単に aを aにList<Mustang>追加したことになりますが、これは明らかに悪いことです。PriusList<Mustang>

を渡すのではなくList、メソッドが のパラメーターIEnumerableまたは他の特定の読み取り専用コレクション型の 1 つを持っている場合、それは「共変」である可能性があります。その場合、リストに追加することはなく、さまざまな要素にアクセスするだけであり、すべてのオブジェクトがオブジェクトである限り問題ではないため、例として an を受け入れIEnumerable<Car>て a を渡すことができます。List<Mustang>MustangCar

デザインも少し…オフのようです。Fordから継承すべきだとは思いませんCarFord車ではなく、ブランド、会社、車の種類です。 Mustang 車なので、車から継承するのは理にかなっています。、などを作成して、それを の(読み取り専用)プロパティにするManufacturerことができる新しいタイプを作成します。FordToyotaCar

于 2012-11-26T20:38:27.083 に答える
1

Mustang のコレクションをパラメーターとして別のメソッドに送信するさまざまな側面については、他の人が既に説明しているので、役立つ情報を少しだけ追加します。

車のコレクションがある場合は、List<Car>次の方法でムスタングのみを取得できます。

IEnumerable<Mustang> mstngs = cars.OfType<Mustang>();
List<Mustang> mstngsLst = mstngs.ToList();

また、ムスタングのコレクションがある場合は、次の方法でList<Mustang>それらすべてを車にキャストできます。

IEnumerable<Car> cars = mstngs.Cast<Car>();
List<Car> carsLst = cars.ToList();

ちなみに、リストに戻すことは必須ではありません。コレクションで何をする必要があるかによって異なります。

于 2012-11-26T20:45:06.500 に答える
0

クラスのメソッドとプロパティにのみアクセスする場合Carは、のリストを渡す理由はありませんMustangsMustangs代わりに、あたかも であるかのように対処する必要がありますCars。それが継承の重要なポイントの 1 つです。タイプ car のリストを作成して、List<Car>それに追加するMustangsだけです。次に type のリストを渡しCarます。これは、継承する任意のオブジェクトを受け入れることができ、必要に応じて厳密な定義のCarプロパティ/メソッドのみを使用しているため、より拡張性があります。Car

クラスで特定の動作が必要であるMustangが、その動作を呼び出すための共通インターフェイスが必要な場合は、 でメソッドを定義してCarから でオーバーライドしますMustang。繰り返しますが、クラスを作成するときにこのメソッドをオーバーライドすることもできるため、これはより拡張性が高く、NineEleven実際に型を公開することなく、子クラスで異なる動作を提供できます。

于 2012-11-26T20:43:56.000 に答える
0

これを行うには、次のように :s をList<Car>含む を渡します。Ford

public void Test()
{
    // This works:
    var fords = new List<Car> {new Ford()};
    FixCars(fords);

    // This does not work (since you cannot pass non car-typed list):
    // var mustangs = new List<Ford> {new Ford()};
    // FixCars(fords);
}

public void FixCars(List<Car> cars)
{
    // Do stuff, for example check actual type and do specialized things:
    foreach (var car in cars)
    {
        var ford = car as Ford;
        if (ford != null)
            ford.Honk();
    }
}

public class Car 
{    
}

public class Ford : Car
{
    public void Honk() {}
}
于 2012-11-26T20:44:46.157 に答える