考虑以下抽象类:
我希望能够使用派生类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
}
}
非常感谢任何帮助或协助/建议
答案 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)
{
}