Открытый класс с внутренним абстрактным членом - PullRequest
1 голос
/ 25 августа 2009

Мы используем DevExpress, и с сегодняшним выпуском произошло странное изменение в одном из их классов печати. ​​

Класс называется ClosedShapeBase и используется для распечатки фигуры в отчете.

Сам класс является общедоступным, но некоторые его свойства защищены внутренним абстрактным, как

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

Есть ли какой-нибудь загадочный способ переопределить этот элемент, даже если он внутренний?

Ответы [ 4 ]

4 голосов
/ 25 августа 2009

«Защищенный внутренний» означает, что собственный код 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();
    }
}
2 голосов
/ 25 августа 2009

защищенный внутренний означает не означает защищенный и внутренний. Это означает защищенный ИЛИ внутренний. Поэтому вы должны иметь возможность переопределить этот метод в других местах за пределами сборки, где определен этот ClosedShapeBase.

1 голос
/ 25 августа 2009
public class MyShape : ClosedShapeBase
{
    protected internal override PointF[] CreatePoints(RectangleF bounds, int angle)
    {
        ...
    }
}

Вы просто должны уважать квалификатор «protected internal» в переопределенном классе.

0 голосов
/ 25 августа 2009

внутренняя защита означает, что любой подкласс может получить доступ (в вашем случае переопределить) к члену. Подкласс может быть расположен в любой сборке. Все классы сборки, в которой определен ваш базовый класс, также могут получить доступ к члену.

С наилучшими пожеланиями

...