[英]How to pass sub-class as a parameter to override an abstract method?
考慮以下抽象類:
我希望能夠使用CanBeGroupedWith
的派生類覆蓋抽象的CanBeGroupedWith
方法並使一切正常工作。 這可能嗎?
public abstract class LineContainer
{
public abstract IEnumerable<Line3d> Get3dLines();
public abstract bool CanBeGroupedWith(LineContainer container);
}
public class DimensionContainer : LineContainer
{
public override IEnumerable<Line3d> Get3dLines()
{ //....etc
}
public override bool CanBeGroupedWith(DimensionContainer container)
{
/// I want this to be able to work with a DimensionContainer
/// parameter since the DimensionContainer is in fact
/// a LineContainer.
/// I want to be able to use the DimensionContainer as a
/// parameter because I want to make use of some specific
/// fields within it.
/// I originally tried to have the LineContainer class as a generic class
/// but I didn't know how to call it while still retaining the CanBeGroupedWith method.
/// I would then have to specify the type the type in a higher
/// level class i.e. LineContainer<DimensionContainer> which is
/// defeats the purpose of the higher level function?
/// Any assistance much appreciated
}
}
非常感謝任何幫助或協助/建議
不,您的評論
因為DimensionContainer實際上是LineContainer
是錯的。 可能是,也可能不是。 您只需要一個LineContainer。
參見下面的人為設計類。 您真的可以假設它是DimensionContainer嗎?
public class NotADimensionContainer : LineContainer
{
// etc
}
internal class Program
{
private static void Main()
{
var dimensionContainer = new DimensionContainer();
var canGroup = dimensionContainer.CanBeGroupedWith(new NotADimensionContainer());
}
}
您可以使用泛型來指定類型必須匹配這樣的派生類型。
public abstract class LineContainer<T> where T : LineContainer<T>
{
public abstract IEnumerable<Line3d> Get3dLines();
public abstract bool CanBeGroupedWith(T container);
}
public class DimensionContainer : LineContainer<DimensionContainer>
{
public override IEnumerable<Line3d> Get3dLines()
{
}
public override bool CanBeGroupedWith(DimensionContainer container)
{
}
}
還要注意,這並不將泛型類型限制為它所應用的派生類。 這就是您可以控制類型並將其至少約束為確實繼承自LineContainer<T>
。
您也可以使方法通用,如下所示:
public abstract bool CanBeGroupedWith<T>(T container) where T : LineContainer;
然后像這樣在DimensionContainer類中覆蓋它。
public override bool CanBeGroupedWith<DimensionContainer>(DimensionContainer container)
{
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.