如何将子类作为参数传递以覆盖抽象方法?

时间:2018-04-30 01:31:48

标签: c# generics polymorphism override abstract-class

考虑以下抽象类:

我希望能够使用派生类LineContainer覆盖抽象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 
    }

}

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

3 个答案:

答案 0 :(得分: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());
    }
}

答案 1 :(得分:1)

您可以使用泛型来指定类型必须与此类型的派生类型匹配。

amount: 60

另请注意,这并不会将泛型类型限制为它所应用的派生类。这就是你如何控制类型,并至少将它约束为一个继承自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) { } } 的类型。

答案 2 :(得分:0)

您也可以将方法设为通用,如下所示:

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

然后在DimensionContainer类中重写它。

public override bool CanBeGroupedWith<DimensionContainer>(DimensionContainer container)
{
}