2016-05-17 8 views
0

私は2つの子クラスと1つの親クラスを持っています。は2つの子クラスに1つの抽象メソッドを実装します

親クラスは抽象メソッドを持ち、パラメータとしてクラスを持ちます。子クラスは、親の抽象メソッドを実装し、別のクラスをパラメータとして持ちます。しかし、子クラスのメソッドがエラーを与える:

abstract class StudentBizz 
{ 
    public abstract Boolean enrollNewStudent(Student stuObj); 
} 

class MScStudentBizz:StudentBizz 
{ 
    public override Boolean enrollNewStudent(MScStudent stuObj) 
    { 
     //code 
    } 
} 
+0

誰かが 'StudentBizz foo = new MScStudentBizz();を実行したときに何をしたいのですか? foo.enrollNewStudent(新しいOtherStudent()) '? ( 'OtherStudent'は' Student'から継承するクラスですが、 'MScStudent'から継承しないクラスです) –

答えて

3

、別のアプローチは、(ここで私はStudentからMScStudent継承を仮定している)generics with type constraintsを使用することができます

abstract class StudentBizz<TStudent> where TStudent : Student 
{ 
    public abstract Boolean enrollNewStudent(TStudent stuObj); 
} 

class MScStudentBizz:StudentBizz<MScStudent> 
{ 
    public override Boolean enrollNewStudent(MScStudent stuObj) 
    { 
     //code 
    } 
} 
+0

これは私が期待していたものです。それは本当にうまくいく。ありがとうございました – Nuwan

1

オーバーライドメソッドは、基本クラスのメソッドと同じシグネチャを持つ必要があります

"does not implement inherited abstract member".

ここでは、コードです。 はだからあなたは、この方法は、のようになります。オーバーライド:あなたのコードの残りの部分に応じて、

class MScStudentBizz: StudentBizz 
{ 
    public override Boolean enrollNewStudent(Student student) 
    { 
    //code 
    } 
} 
+0

解決策がない場合は??唯一の解決策は、同じメソッドの署名を使用することですか? – Nuwan

+1

@Nuwan: 'student'パラメータのタイプを変更したい場合は、' StudentBizz'のジェネリック型パラメータを使う必要があります。 – AntiTcb

+2

はい。抽象メンバを宣言すると、オーバーライドするシグネチャがまったく同じである必要があります。その問題を回避するには2つの方法があります。他の人が示唆しているように、基本は生徒のタイプに汎用性を持たせることです。もう1つは、より具体的なオーバーロードを呼び出す派生クラスの明示的な実装を使用して、Studentメソッドのインタフェースを使用することです。その方法では、インターフェイスを使用しているコードは基本的な学生(またはIStudent)を使用しますが、派生クラスを使用しているコードは対応する特殊な学生を使用します。 – Zastai

関連する問題