Как переопределить метод в другой сборке?

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

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

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

<CSBlog:TagBreadCrumb />

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

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

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

Вот метод:

 public virtual string FormatTags(string[] tagList)

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

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

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

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

5 ответов

Решение

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

public override string FormatTags(string[] tagList) {
    string result = base.FormatTags(tagList);
    // do something with result
    return result;
}

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

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

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

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

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

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

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

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

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

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

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

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

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);

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

Абсолютно правильно.

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

Другие вопросы по тегам