Вопрос

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

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

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

<CSBlog:TagBreadCrumb />

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

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

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

Вот метод:

 public virtual string FormatTags(string[] tagList)

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

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

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

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

Это было полезно?

Решение

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

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() — это правильно?

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

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

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

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

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

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

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

Если вы обнаружите, что вам нужно копировать много кода, вам следует подумать о реструктуризации вашего метода.Поместите копируемый код в другой метод, который вы не будете переопределять, а затем, когда вы переопределите 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top