Я хочу написать что-то вроде следующего:
internal class InternalData
{
}
public class PublicData
{
}
abstract internal class Base {
internal Base() { }
private static InternalData CreateInternalDataFromPublicData(PublicData publicData)
{
throw new NotImplementedException();
}
abstract protected void DoProcess(InternalData internalData);
public void Process(PublicData publicData)
{
InternalData internalData = CreateInternalDataFromPublicData(publicData);
DoProcess(internalData);
}
}
public sealed class Derived : Base
{
protected override void DoProcess(InternalData internalData)
{
throw new NotImplementedException();
}
}
То есть Base
содержит некоторую внутреннюю логику и не предназначен для наследования классами вне моей сборки;и Derived
доступен снаружи.InternalData
также содержит некоторую внутреннюю логику и, поскольку она никогда не будет использоваться извне, я также хочу сделать ее внутренней.
Конечно, приведенный выше код не будет компилироваться как Base
не должен быть менее доступным, чем Derived
.Я могу установить Base
равным public
, это нормально, но это приводит к другой проблеме.Если Base
является общедоступным, то, возможно, в некоторой другой сборке может быть ExternalDerived : Base
.Но Base.DoProcess
принимает InternalData
в качестве аргумента, так что ExternalDerived
не может его реализовать (поскольку он не знает о InternalData
).Внутренний беспараметрический конструктор Base
предотвращает создание любых ExternalDerived
экземпляров, и, таким образом, никто не будет реализовывать ExternalDerived.DoProcess
, и не требуется InternalData
публичное раскрытие, но компилятор этого не знает.
Как можноя переписал код выше, чтобы был абстрактный метод DoProcess(InternalData)
и чтобы класс InternalData
был внутренним?