2

私には3つのタイプがあります:

  1. Patient
  2. Inpatient : Patient
  3. Outpatient : Patient

ベースの患者とそのすべてのプロパティを入力し、オブジェクトPatientRepository.FillPatient()を返すメソッドがあります。Patient

次に、タイプが何であるかを確認して確認し、またはPatientのいずれかにダウンキャストする必要があります。OutpatientInpatient

ダウンキャストしようとすると、スローされUnable to cast object of type 'Patient' to type 'Inpatient'.ます これは実行時エラーです。

if (patient.Type == PatientType.Inpatient)
{
    var inpatient = (Inpatient)patient;             
    return inpatient;
}

public enum PatientType
{
    Inpatient, Outpatient
}

理由がわかりません。ここで根本的に何か間違ったことをしていますか?

4

2 に答える 2

3

FillPatientは、特定のクラスを正しい方法で返す必要があります

public static Patient FillPatient()
{
    if (something) {
        return new InPatient();
    }
    else {
        return new OutPatient();
    }
}

次に、特定のクラスにダウンキャストできます

Patient patient = PaitentRepository.FillPatient();

if (patient is InPatient) {
    ...
}
else {
    ...
}

注:ほとんどの場合、クラスが他のN個のクラスのベースである場合、そのベースクラス(あなたの場合は患者)は抽象的です。

于 2013-01-23T18:35:56.877 に答える
1

質問には「スロー」と書かれているので、これはランタイムエラーだと思います。これはPatientRepository.FillPatient()、タイプのオブジェクトを返し、Patientどこかにが含まれていることを意味しますnew Patient()。基本クラスPatientをとしてマークするabstractと、コンパイラエラーが発生するはずです。

ある時点でサブタイプにキャストPatientRepository.FillPatient()する場合は、このサブタイプのインスタンスを作成する必要があります。したがって、使用する代わりに、入力しようとしている患者のタイプに応じnew Patient()て使用する必要があります。new Inpatient()new Outpatient()

于 2013-01-23T18:37:11.873 に答える