1

考虑以下抽象类:

我希望能够CanBeGroupedWith用 LineContainer 的派生类覆盖抽象方法并让一切正常。这可能吗?

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 
    }

}

非常感谢任何帮助或帮助/建议

4

3 回答 3

1

您可以使用泛型来指定类型必须像这样匹配派生类型。

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>

于 2018-04-30T02:00:09.443 回答
1

不,您的评论

因为 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());
    }
}
于 2018-04-30T01:55:02.080 回答
0

您也可以只使方法通用,如下所示:

public abstract bool CanBeGroupedWith<T>(T container) where T : LineContainer;

然后在 DimensionContainer 类中像这样覆盖它。

public override bool CanBeGroupedWith<DimensionContainer>(DimensionContainer container)
{
}
于 2018-04-30T09:50:18.900 回答