Как переопределить метод в другой сборке? - PullRequest
1 голос
/ 19 марта 2009

Ранее я задавал вопрос об интерфейсах и получил несколько отличных ответов. Я очень рад начать разработку действительно гибкого кода.

Теперь у меня есть вопрос о переопределении виртуального метода.

В настоящее время я работаю с SDK Сервера совместной работы. Одним из элементов управления является «крошечная» хлебная крошка. Таким образом, он будет перечислять «теги» на соответствующем объекте.

<CSBlog:TagBreadCrumb />

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

Поскольку у меня есть SDK для Сервера совместной работы, я нашел элемент управления, который отображает «список тегов», и внес в него изменения, которые делают то, что я хочу, однако, насколько я понимаю, модификация ядра по многим причинам нецелесообразна.

Итак, я хотел бы создать свой собственный элемент управления, который практически на 100% идентичен базовому элементу управления, но перекрывает один метод.

Вот метод:

 public virtual string FormatTags(string[] tagList)

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

Итак, я понимаю, что я создаю свой элемент управления, исходя из базового элемента управления - и я могу написать свой собственный метод FormatTags () - это правильно?

Мне нужно изменить только один его аспект, но означает ли это, что мне нужно скопировать исходный код этого метода из базового класса - и изменить то, что мне нужно там? Он просто не чувствует правильного кода в одном месте, но я не знаю другого способа расширить метод без изменения кода в базовом классе.

Спасибо за любые предложения.

Ответы [ 5 ]

5 голосов
/ 19 марта 2009

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

Итак, ваш код будет выглядеть примерно так:

public override string FormatTags(string[] tagList)
{
  // strip special tags
  string[] newTagList = stripTags(tagList);
  return base.FormatTags(newTagList);
}

Таким образом, вам не нужно понимать, как базовый класс форматирует выходную строку.

Если вы вместо этого захотите изменить формат выходной строки, вы не будете делать какие-либо вызовы базового метода (поскольку этот метод может изменить его форматирование в будущих выпусках, на которое вы не хотите влиять ).

4 голосов
/ 19 марта 2009

Вы все еще можете запустить метод dervied и оперировать его результатами:

public override string FormatTags(string[] tagList) {
    string result = base.FormatTags(tagList);
    // do something with result
    return result;
}
1 голос
/ 19 марта 2009

Взгляните на методы расширения . Это позволяет вам расширить возможности закрытого класса, который вы не можете редактировать или расширять, определяя свою функцию в своем собственном статическом классе. Вот пример, который я только что написал (может иметь синтаксические ошибки).

public static class MyExtensions
{
    public static string AppendCrazyText(this string s, string crazyText)
    {
        return s + crazyText;
    }
}

Теперь, чтобы получить доступ к этому, я могу просто позвонить:

string myString = "Hello world";
string myCrazyText = ", lets go crazy!";

string myResult = myString.AppendCrazyText(myCrazyText);
1 голос
/ 19 марта 2009

Итак, я понимаю, что я создаю мой контроль, вытекающий из базы контроль - и я могу написать свой собственный Метод FormatTags () - это правильно?

Абсолютно верно.

Если вы обнаружите, что вам нужно скопировать много кода, вам следует подумать о реструктуризации вашего метода. Поместите код, который копируется, в другой метод, который вы не переопределите, а затем, когда вы переопределите FormatTags, измените то, что вам нужно, и просто получите доступ к тому коду, который вы скопировали, вызвав другой метод.

1 голос
/ 19 марта 2009

Итак, я понимаю, что я создаю свой элемент управления, исходя из базового элемента управления - и я могу написать свой собственный метод FormatTags () - это правильно?

Это верно; при переопределении вы предоставляете собственную реализацию метода базового класса.

В лучшем случае происходит одно из двух:

  • Существует простой способ преобразовать выходные данные метода базового класса в желаемый результат.

  • Базовый класс использует шаблон Стратегии или его вариант, так что вы просто предоставляете альтернативную реализацию соответствующей части Стратегии.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...