簡體   English   中英

如何通過子類作為參數來覆蓋抽象方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM