Я хочу написать что-то вроде следующего:
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();
}
}
То есть База
содержит некоторую внутреннюю логику и не предназначена для наследования классами вне моей сборки; и Производный
доступен извне.
InternalData
также содержит некоторую внутреннюю логику, и, поскольку она никогда не будет (и не должна) использоваться извне, я также хочу сделать ее внутренней.
Конечно, приведенный выше код не будет компилироваться, поскольку Base
не должна быть менее доступной, чем Derived
. Я могу установить Base
как public
, это нормально, но это приводит к другой проблеме.
Если Base
является общедоступной, то, возможно, в какой-то другой сборке может быть какая-то ExternalDerived: Base
. Но Base.DoProcess
принимает InternalData
в качестве аргумента, так что ExternalDerived
не может его реализовать (поскольку он не знает о InternalData
]).
Внутренний конструктор без параметров Base
предотвращает создание любых экземпляров ExternalDerived
, и поэтому никто не будет реализовывать ExternalDerived.DoProcess
и не требуется публичное раскрытие InternalData
, но компилятор этого не знает.
Как я могу переписать приведенный выше код, чтобы был абстрактный метод DoProcess (InternalData)
и чтобы класс InternalData
был внутренним?