Скрытие методов от других классов при наследовании от класса и Интерфейсного или Абстрактного класса

Чтобы улучшить дальнейшую реализацию и предложить некоторые рекомендации и сделать все максимально универсальным в рамках проекта, я создал интерфейс с несколькими методами, которые следует использовать. Однако только один метод этого класса должен быть виден пользователю, вызывающему этот класс, поэтому я бы хотел, чтобы они были защищенного типа. Например

public class ClassThree
{
    public ClassThree()
    {
        var classOne = new ClassOne();
        class1.MethodOne();
    }
}

Это несмотря на то, что ClassOne имеет 4 метода, 3 метода используются только в одном общедоступном классе, следовательно, частном или защищенном. Однако эти 3 метода необходимы для работы 4-го метода (в идеальном мире другие разработчики будут следовать тому же принципу). Поэтому я не хочу видеть следующее всплывающее окно на intellisense:

class1.MethodTwo();
class1.MethodThree();
class1.MethodFour();

Я знаю, что можно неявно вызывать методы из интерфейса, например

IInterface.MethodTwo<Type,Type>(string name)
{
  //Do stuff here
}

Однако я хотел бы предотвратить все приведения при вызове указанных методов в самом ClassOne, поскольку это просто бельмо на глазу. Мне нравится, когда мой код чист, а для меня это совсем не чисто. Я думал об абстрактном классе, однако мой класс наследуется от другого класса. С интерфейсом я мог просто сделать

public ClassOne : ClassTwo, IInterface<Type1,Type2>

Когда я делаю это с абстрактным классом, Visual Studio говорит, что ожидается интерфейс. Любые идеи приветствуются и ценятся, поскольку я хотел бы улучшить свой код, облегчив свою жизнь и жизнь коллег-разработчиков, которым приходится использовать мой код.

Заранее спасибо!

Редактировать: Сценарий заключается в том, что может быть несколько классов, таких как ClassOne, которые по существу делают то же самое, но используют разные типы, поскольку объекты, которые они должны возвращать, содержат разные значения. Однако наращивание этих объектов более или менее одинаково, например:

  1. Соберите все данные API
  2. Получите список, который нужно экспортировать в API, и вызовите #3 или #4 в зависимости от типа.
  3. Экспорт типа 1 в API
  4. Экспорт типа 2 в API

Идея всегда одна и та же, но, естественно, для разных API потребуются разные переменные. Но чтобы обеспечить выполнение всех шагов, как и раньше, я хотел бы реализовать интерфейс или что-то еще, но шаги 1, 2 и 3 должны быть закрытыми или защищенными, и только шаг 2 должен быть доступен для класса, который его использовал. Однако, если я поставлю в интерфейс только метод 2, я никогда не смогу быть уверен, что другие будут реализовывать 1,3 и 4. И это своего рода цель здесь: P. При этом ClassOne также наследуется от другого класса, а не только от интерфейса.

Редактировать 2: я знаю, что интерфейсы предоставляют только общедоступные методы, поэтому я ищу альтернативы, отсюда и этот вопрос. Я знаю, что с этим не так, я просто не понимаю, как я могу сделать это так, как мне хотелось бы. Спасибо за ответы!

Редактировать 3: Интерфейс в настоящее время выглядит так, я просто изменил имена переменных для примера.

   public interface IExport<in T, in TU>
    {
        void GetRequiredApiData();

        bool MethodOne(List<Type> list);

        bool ExportOne(T one);

        bool ExportTwo(TU two);

        bool ValidateExport();
    }

person Community    schedule 23.06.2015    source источник
comment
Немного сложно понять, что вы говорите. Вы говорите об интерфейсе в первом абзаце, но это каким-то образом превращается в класс в середине предложения. Этот класс (я полагаю, ClassOne) имеет некоторые методы, которые вы хотите скрыть от использования кода. Не могли бы вы уточнить, почему не работает создание закрытых или защищенных членов? Кроме того, что такое ClassThree? Это потребляющий код?   -  person Asad Saeeduddin    schedule 23.06.2015
comment
Добавлено дополнительное объяснение, надеюсь, теперь оно более понятно!   -  person    schedule 23.06.2015
comment
Все методы из интерфейса являются общедоступными, и по замыслу вы можете наследовать свои данные только от 1 класса (даже если он абстрактный). Надеюсь, это поможет вам   -  person kevinrodriguez-io    schedule 23.06.2015
comment
@darkndream Есть ли какая-нибудь альтернатива, которую я могу использовать? Вся логика в значительной степени здесь. Только эти 3 метода при вызове класса бросаются в глаза. Кроме создания текстового файла, в котором говорится, попробуйте следовать этому руководству (которое, скорее всего, никогда не сработает): P.   -  person    schedule 23.06.2015
comment
Вместо того, чтобы искать альтернативы, я бы сказал, что вам, вероятно, следует следовать тому, с чем вы сталкиваетесь. Попробуйте не раскрывать ничего, кроме одного общедоступного метода, чтобы запустить этот процесс. Все остальное должно быть внутренним для этого класса. Если для этого требуется взять код вызова извне и поместить его в этот класс, пусть будет так. Это не должно быть проблематично и, вероятно, в любом случае поможет отделить вещи.   -  person moarboilerplate    schedule 23.06.2015
comment
Добавлен пример интерфейса.. это не столько для того, чтобы сделать код более функциональным, чтобы эти 5 методов были реализованы каждым разработчиком, работающим над будущими частями этой части проекта. Так легче понять в долгосрочной перспективе. Извините, если я здесь идиот, ха-ха. Мне не нужно использовать интерфейс или абстрактный класс, так как без него можно обойтись. Я просто хочу следовать универсальному руководству в рамках этой части проекта.   -  person    schedule 23.06.2015
comment
Я бы заранее избегал такого дизайна, потому что может быть очень сложно реорганизовать 85 объектов, которые состоят в основном из скопированного шаблона. Однако, чтобы выполнить то, что вы хотите, вместо того, чтобы использовать этот объект для выполнения всей работы, сохраните один общедоступный метод для этого объекта и заставьте его вызывать 4 метода для другого объекта, который вы создаете, который использует абстрактный класс для определения защищенных методов. .   -  person moarboilerplate    schedule 23.06.2015
comment
Ура попробую это!   -  person    schedule 23.06.2015


Ответы (1)


Остальные три метода следует вызывать внутри общедоступного метода или сделать первый метод закрытым/защищенным и вызывать все 4 внутри одного общедоступного метода.

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

Я подозреваю, что вам нужно, чтобы эти три метода вызывались в разное, определенное время и в определенном порядке. Если это так, то у вас есть запах кода. Эти методы, вероятно, являются просто подпрограммами void, которые имеют побочные эффекты и изменяют глобальное состояние. Код должен быть реорганизован, чтобы он не был просто серией подпрограмм, а объекты должны быть разбиты по-другому.

person moarboilerplate    schedule 23.06.2015
comment
В моем классе у меня есть несколько свойств, которые представляют собой списки объектов. Они заполняются в первом методе методами класса в классе Get (который наследуется). Этот класс Get вызывает статический класс Request, который содержит универсальные методы для выполнения вызовов API, предоставляя требуемые типы и т. д. Затем я могу использовать эти значения, чтобы увидеть, действительно ли они доступны в API, на который я ориентируюсь, иначе возникнут плохие запросы. После прохождения этих проверок я могу экспортировать указанный объект в API. Можно ли как-то улучшить эту логику? - person ; 23.06.2015
comment
Поместите параметры типа, которые вам нужны, в метод (ы), а не в сам объект. Таким образом, вы можете сохранить свою структуру наследования без вмешательства параметров типа. - person moarboilerplate; 23.06.2015