Как предотвратить наследование абстрактного класса с общедоступными производными классами в других сборках?

Я хочу написать что-то вроде следующего:

    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 был внутренним?

6
задан penartur 22 February 2012 в 10:50
поделиться