96

私はC#(およびOOP)が初めてです。次のようなコードがある場合:

class Employee
{
    // some code
}


class Manager : Employee
{
    //some code
}

質問 1 : これを行う他のコードがある場合:

   Manager mgr = new Manager();
   Employee emp = (Employee)mgr;

ここEmployeeに がありますがManager、そのようにキャストすると、Employeeそれはアップキャストされていることを意味しますか?

質問 2 :

いくつかのEmployeeクラス オブジェクトがあり、すべてではないものの一部がManagerである場合、可能であればそれらをダウンキャストするにはどうすればよいですか?

4

6 に答える 6

104
  1. それは正しいです。これを行うと、それをオブジェクトにキャストすることになりますemployee。つまり、マネージャー固有のものにアクセスすることはできません。

  2. ダウンキャスティングとは、基本クラスを取得して、それをより具体的なクラスに変換することです。これは、isと次のような明示的なキャストを使用して実行できます。

    if (employee is Manager)
    {
        Manager m = (Manager)employee;
        //do something with it
    }
    

または次のasような演算子を使用します。

Manager m = (employee as Manager);
if (m != null)
{
    //do something with it
}

不明な点がある場合は、修正させていただきます。

于 2009-10-06T08:09:29.513 に答える
51

(Employee)someInstance型が別の型から派生しているかどうかをコンパイラがコンパイル時に通知できるため、アップキャスト(を使用)は一般に簡単です。

ただし、コンパイラは問題のインスタンスが指定されたタイプであるかどうかを常に認識しているとは限らないため、ダウンキャストは通常​​、実行時に実行する必要があります。C#は、このために2つの演算子を提供します。これ、ダウンキャストが機能するかどうかを示し、true/falseを返します。そしてキャストを試みて、可能であれば正しいタイプを返し、そうでない場合はnullを返します。

従業員がマネージャーであるかどうかをテストするには:

Employee m = new Manager();
Employee e = new Employee();

if(m is Manager) Console.WriteLine("m is a manager");
if(e is Manager) Console.WriteLine("e is a manager");

これも使えます

Employee someEmployee = e  as Manager;
    if(someEmployee  != null) Console.WriteLine("someEmployee (e) is a manager");

Employee someEmployee = m  as Manager;
    if(someEmployee  != null) Console.WriteLine("someEmployee (m) is a manager");
于 2009-10-06T08:10:13.267 に答える
18
  • アップキャストは、サブクラス参照から基本クラス参照を作成する操作です。(サブクラス -> スーパークラス) (つまり、マネージャー -> 従業員)
  • ダウンキャストは、基本クラスの参照からサブクラスの参照を作成する操作です。(スーパークラス -> サブクラス) (つまり、従業員 -> マネージャー)

あなたの場合

Employee emp = (Employee)mgr; //mgr is Manager

あなたはアップキャストをしています。

実行時に失敗する可能性があるため、明示的なキャストを必要とするダウンキャストとは異なり、アップキャストは常に成功します ( InvalidCastException )。

C# には、この例外がスローされないようにするための 2 つの演算子が用意されています。

から始まる:

Employee e = new Employee();

初め:

Manager m = e as Manager; // if downcast fails m is null; no exception thrown

2番:

if (e is Manager){...} // the predicate is false if the downcast is not possible 

警告: アップキャストを行うと、スーパークラスのメソッド、プロパティなどにのみアクセスできます...

于 2015-09-28T13:48:34.613 に答える
7

各 Employee オブジェクトが Manager オブジェクトかどうかを確認する必要がある場合は、OfType メソッドを使用します。

List<Employee> employees = new List<Employee>();

//Code to add some Employee or Manager objects..

var onlyManagers = employees.OfType<Manager>();

foreach (Manager m in onlyManagers) {
  // Do Manager specific thing..
}
于 2014-01-22T18:05:35.997 に答える