none
Доступ к приватным членам статического класса. RRS feed

  • Вопрос

  • Добрый день!
    Есть статический класс, реализующий несколько статических методов.
    Задача: создать класс, реализующий такие же методы, но возвращающие другие типы, при этом использовать логику, содержащуюся в приватных членах первого класса.

    Можно как-то решить эту задачу без копирования кода первого класса во второй?

    25 декабря 2012 г. 14:49

Ответы

  • Хм.

    В статическом классе не могут быть объявлены экземплярные члены. Стало быть, те приватные члены, о которых идёт речь, статические, так?

    Статические классы могут быть унаследованы только от Object. Поэтому невозможно создать статический класс-наследник.

    В итоге, приходим к такому решению: в другом классе можно вызывать публичные члены первого класса. Но к приватным членам доступ нельзя получить. Их логику можно использовать только через вызовы публичных членов.

    • Помечено в качестве ответа YatajgaEditor 25 декабря 2012 г. 18:18
    • Снята пометка об ответе YatajgaEditor 25 декабря 2012 г. 18:18
    • Предложено в качестве ответа YatajgaEditor 25 декабря 2012 г. 18:18
    • Помечено в качестве ответа Jovanny66 26 декабря 2012 г. 6:59
    25 декабря 2012 г. 18:12

Все ответы

  • Не знаю пременителен ли ответ VB'шника к C#'нику, но я бы в наследнике класса переопределил бы метод. В нем получил результат используя логику исходного класса, а затем привел бы его к требуемому типу. Соответственно у нужных методов исходного класса стоит пометка, что он переопределяемый.

    Как это выглядит на C# к сожалению не знаю.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    25 декабря 2012 г. 15:54
    Отвечающий
  • Хм.

    В статическом классе не могут быть объявлены экземплярные члены. Стало быть, те приватные члены, о которых идёт речь, статические, так?

    Статические классы могут быть унаследованы только от Object. Поэтому невозможно создать статический класс-наследник.

    В итоге, приходим к такому решению: в другом классе можно вызывать публичные члены первого класса. Но к приватным членам доступ нельзя получить. Их логику можно использовать только через вызовы публичных членов.

    • Помечено в качестве ответа YatajgaEditor 25 декабря 2012 г. 18:18
    • Снята пометка об ответе YatajgaEditor 25 декабря 2012 г. 18:18
    • Предложено в качестве ответа YatajgaEditor 25 декабря 2012 г. 18:18
    • Помечено в качестве ответа Jovanny66 26 декабря 2012 г. 6:59
    25 декабря 2012 г. 18:12
  • Можете вызывать статические методы в вашем новом коде, т.е. сделаете класс обёртку. А вот к приватным членам вам доступ не получить
    25 декабря 2012 г. 18:13
    Модератор
  • через рефлексию наверное можно

    или не?

    25 декабря 2012 г. 19:36
  • через рефлексию наверное можно

    или не?

    Теоретически можно. Однако, речь идёт о статических членах. По правилам хорошего тона (и гайдлайнам Майкрософт), все статические члены должны быть потокобезопасными. Я не могу с ходу сказать, легко ли будет обеспечить это требование при работе через рефлексию. Хотя топикстартеру это может быть и не нужно.

    К тому же, топикстартер хочет упростить код, избежав копирования, а рефлексия его только усложнит.

    25 декабря 2012 г. 20:43
  • Ну да, упрощения не особо получится.

    Конечно наверное придётся делать не приватными методами, и тогда ими пользоваться для создания своих методов, и возврата чего нужно.

    а так.. кто же знает,
    может там нет возможности добраться до кода (потому и без копирования).
    может там задотфускачено даже.
    Известно только как методы называются после дотфускации.
    (Неплохо пофантазировал)

    Тогда в новом классе с новыми такими же методами, но возвращающими другой тип (то что надо),
    придётся получать по рефлексии тот переделываемый метод (нужный в данный момент).
    Ну и вызывать его, создавать экземпляр нужного типа и его возвращать.





    • Изменено INFEL8 26 декабря 2012 г. 5:01
    26 декабря 2012 г. 4:58
  • Спасибо всем, ситуация ясна. Рассматриваю идею сделать класс не статическим.
    26 декабря 2012 г. 7:02