2009-08-25 101 views
1

我们使用DevExpress和今天发布了一个奇怪的变化,他们的印刷类之一。公共课与内部抽象成员

该类被命名为ClosedShapeBase,它用于在报表中打印出形状。

类本身是公共的,但它的一些属性被保护的内部抽象,像

public abstract class ClosedShapeBase : ShapeBase 
{ 
    protected internal abstract PointF[] CreatePoints(RectangleF bounds, int angle); 
} 

是否有什么神秘的方式能够覆盖哪怕是内部会员?

回答

4

“受保护的内部”仅仅意味着DevExpress自己的代码在他们的项目中可以访问它。除了该项目之外的所有目的(AssemblyInfo中的一些魔术除外),它就像它只是“受保护”一样。 DevEx遍布全球。

你并不需要保持在自己控“内部”:

任何的子类可以访问(在你的情况下重写)成员
public class Foo 
    : ClosedShapeBase 
{ 
    protected override ShapeBase CloneShape() 
    { 
     throw new NotImplementedException(); 
    } 

    protected override PointF[] CreatePoints(RectangleF bounds, int angle) 
    { 
     throw new NotImplementedException(); 
    } 

    protected override ILinesAdjuster GetLinesAdjuster() 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

有趣的是,我不知道。我能够像你的例子一样创建一个测试形状,但是我也有一个关于内部属性获取器的错误。我使用了反射器来检查该属性,定义是“内部抽象PreviewStringId ShapeStringId {get;}”。有什么想法? – 2009-08-25 16:03:06

+0

我能够使用你的评论找出别的东西。我从另一个已经覆盖该私有内部属性的ClosedShapeBase子类中继承。谢谢。 – 2009-08-25 16:06:27

1
public class MyShape : ClosedShapeBase 
{ 
    protected internal override PointF[] CreatePoints(RectangleF bounds, int angle) 
    { 
     ... 
    } 
} 

你只需要尊重重写类中的“受保护的内部”限定符。

+0

我不是继承形式相同的程序集。在这种情况下,错误是“找不到合适的方法覆盖”。 – 2009-08-25 15:53:07

+0

但它有什么好处?为什么DevExpress使用此限定符? – HuBeZa 2009-08-25 15:53:15

+1

他们这样做是为了让他们的画家和信息班可以访问这些。 DevEx使用至少4或5个类来完成大部分工作。 – 2009-08-25 15:55:04

0

内部保护手段。子类可以位于任何程序集中。定义基类的程序集的所有类也可以访问该成员。

问候

2

保护内部确实意味着保护内部。它意味着保护内部。因此,您应该能够在定义了该ClosedShapeBase的程序集外部的其他位置覆盖该方法。

+0

更具体地说,如果您在同一个程序集中重写该类,它也将包含“内部”修饰符。在这种情况下,这个方法是抽象的,所以你不能“使用”它,但如果它是虚拟的 - 你可以通过继承类或通过在同一个程序集中创建它的一个实例来使用它。 – HuBeZa 2009-08-25 16:08:10

+0

你是什么意思,你不能“使用”它?底线是你可以在同一个程序集或另一个程序集中使用受保护的内部访问修饰符覆盖该方法。 – 2009-08-25 16:17:32