問題との共変微分を返しの種類から抽象メソッド
-
20-09-2019 - |
質問
ようにしていを包み込むように重要な要素となりつつあり、ビート下抽象メソッドおよび戻り値の型の分散共分散って掲載して同じような質問を私は永遠に、この場を借りて御礼申し上げるためのコミュニティ情報が提供されなかった場合、必要最後押しに仕上げます。この思い:2つの抽象クラスRecruiterBaseとCandidateBaseしても、concreateの実装RecruiterAとCandidateA.RecruiterBaseての抽象メソッドをすべて取得し採用候補者に帰IQueryable.私の実施RecruiterAオーバーライドのGetCandidates()メソッドの返IQueryable.
public abstract class RecruiterBase
{
// Constructors declared here
public abstract IQueryable<CandidateBase> GetCandidates();
}
public abstract class CandidateBase
{
// Constructors declared here
}
の実装:
public class CandidateA : CandidateBase
{
// Constructors declared here
}
public class RecruiterA : RecruiterBase
{
// Constructors declared here
// ----HERE IS WHERE I AM BREAKING DOWN----
public override IQueryable<CandidateA> GetCandidates()
{
return from c in db.Candidates
where c.RecruiterId == this.RecruiterId
select new CandidateA
{
CandidateId = c.CandidateId,
CandidateName = c.CandidateName,
RecruiterId = c.RecruiterId
};
}
}
うcomplileるスローコンパイル時にエラーがあったからで実施RecruitreBaseのGetCandidates()メソッドを返します IQueryable<CandidateA>
の代わりに IQueryable<CandidateBase
>.
後になるべきことを提案は、以前の問題汎種類から抽象インストール方法)仕事をしたので、だいじょうぶかと思います-読む-のために、以下の質問で
どうやって取り戻すサブタイプにオーバーライド方式のサブクラスはクライアントまで、フルのC#?
されるようにしたことのなかった私にとってはうって検索した方法を共分散のために私を返します。使用したマークGravellのスニペット...
abstract class BaseClass
{
public BaseReturnType PolymorphicMethod()
{ return PolymorphicMethodCore();}
protected abstract BaseReturnType PolymorphicMethodCore();
}
class DerivedClass : BaseClass
{
protected override BaseReturnType PolymorphicMethodCore()
{ return PolymorphicMethod(); }
public new DerivedReturnType PolymorphicMethod()
{ return new DerivedReturnType(); }
}
...の基礎となった。それで私のRecruiterBaseとRecruiterA授業のように見え:
public abstract class RecruiterBase
{
// Constructors declared here
public IQueryable<CandidateBase> GetCandidates()
{
return GetCandidatesCore();
}
public abstract IQueryable<CandidateBase> GetCandidatesCore();
}
私の実施...
public class RecruiterA : RecruiterBase
{
// Constructors
protected override IQueryable<CandidateBase> GetCandidatesCore()
{
return GetCandidates();
}
public new IQueryable<CandidateA> GetCandidates()
{
return from candidates in db.Candidates
select new CandidateA
{
CandidateId = candidates.CandidateId,
RecruiterId = candidates.RecruiterId
};
}
}
つくろうと思いましたが最後に取得していましたがってコンパイル時にエラーには、次のコードでGetCandidates()できない暗黙的に変換CandidateAにCandidateBase:
protected override IQueryable<CandidateBase> GetCandidatesCore()
{
return GetCandidates();
}
もちろんキャスト:
protected override IQueryable<CandidateBase> GetCandidatesCore()
{
return ((IQueryable<CandidateBase>)GetCandidates());
}
もし統が実際に通話GetCandidates()は私のコントローラーを返します IQueryable<CandidateBase>
の代わりに IQueryable<CandidateA>
.私ぐに戻っています。
合することになってのことだったのを選びましょう。12パックのお好みのビール!
解決
ジャスティン私は少し混ぜ必要なものすべてがります。
場合は抽象メソッドの戻り値の型 IQueryable<CandidateBase>
そこにいるかを取得します。きというものはないと思いことからその後ますまだまだ十分とはいえませんがキャストで CandidateA または CandidateB
うごうとして目指すものは何かかないといけないと理解できます。
編集追加:
ジャスティン、どうでしょうか。
public abstract class RecruiterBase<T>
{
// Constructors declared here
public abstract IQueryable<CandidateBase> GetCandidates();
}
public abstract class CandidateBase
{
// Constructors declared here
}
public class CandidateA : CandidateBase
{
}
public class RecruiterA : RecruiterBase<RecruiterA>
{
// Constructors declared here
// ----HERE IS WHERE I AM BREAKING DOWN----
public override IQueryable<CandidateBase> GetCandidates()
{
return db.Candidates.Where(cand => cand.RecruiterId == this.RecruiterId)
.Select(x => new CandidateA
{
CandidateId = c.CandidateId,
CandidateName = c.CandidateName,
RecruiterId = c.RecruiterId
})
.Cast<CandidateBase>()
.AsQueryable();
}
}
他のヒント
行きたいという意味での結果であることが欠落している点の多型コードともなる。
目的のオブジェクトによる抽象的なタイプまたはそのインタフェースができる仕事 他の コンクリート実装する必要がなく、知 他の コンクリート実装です。行きたいという考えでは返コンクリートの種類を生産高品質なコードでは、がんを始めとを否定する値は、抽象基底クラスで覆い、可能です。
適切に内蔵のセット由来の授業を通して平和について非常に少数のニーズにおける対処すべき課題そのコンクリートタイプ抽象クラスだけで十分であり作のためのすべての実装および処理する必要がありますが、多数のクラスの例外は少数派だったのです。