Pergunta

Eu fiz uma pergunta sobre interfaces anteriormente e tem alguns excelentes respostas. Estou muito animado para começar a desenvolver o código realmente flexível.

Agora tenho uma pergunta sobre a substituição de um método virtual.

Eu estou trabalhando atualmente com o Server SDK Comunidade. Um dos controles é um 'tag' migalha de pão. Assim, ele irá listar os 'tags' no objeto relevante.

<CSBlog:TagBreadCrumb />

Eu estou usando tags para permitir que adminstrators para pontos-alvo específicos de conteúdo para aparecer em um layout, no entanto essas marcas não são relevantes para o usuário final. Por exemplo, a tag 'Home_Main' é usado para direcionar o painel principal na página inicial, mas eu não quero usuário para ver isso.

Desde que eu tenho o SDK para o Community Server, achei o controle que torna a 'lista tag' e feitas modificações que fazer o que eu quero - no entanto o meu entendimento é que ele não é bom para modificar o núcleo por muitas razões.

Então, o que eu gostaria de fazer é criar meu próprio controle, que é essencialmente quase 100% idêntico ao controle de base, mas substituir um método.

Aqui está o método:

 public virtual string FormatTags(string[] tagList)

Dentro de lá é o código para formatar as tags, e eu gostaria de escrever meu próprio código que faz tudo a mesma coisa, exceto cheques um arquivo de configuração para 'tags' para excluir.

Então, o meu entendimento é que eu crio meu controle, decorrente do controle de base - e eu posso escrever meu próprio método FormatTags (?) - isso está correto

Eu só precisa mudar um aspecto dele, mas isso significa que eu tenho que copiar o código original para que o método da classe base - ea mudança que eu preciso para lá? Ele apenas não sente código certo copyign de um ponto, mas eu não sei de outra maneira de estender o método sem alterar o código na classe base.

Obrigado por todas as sugestões.

Foi útil?

Solução

Você ainda pode executar o método derivado e operar em seus resultados:

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

Outras dicas

No seu caso (Onde você deseja suprimir certas marcas sejam impressos na farinha de rosca), você tira todas as tags especiais antes de chamar o método base.

Assim, seu código seria algo parecido com:

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

Desta forma, você não precisa entender como a classe base formata a string de saída.

Se você, em vez queria modificar o formato do texto de saída, você não iria fazer todas as chamadas para o método base (Dado que esse método pode estar mudando é a formatação em versões futuras, o que você não quer ser impactado por ).

Então, o meu entendimento é que eu crio meu controle, decorrente do controle de base - e eu posso escrever meu próprio método FormatTags (?) - isso está correto

É isso mesmo; quando você substitui, você fornecer sua própria implementação do método de uma classe base.

No melhor dos casos, uma das duas coisas acontecem:

  • Há uma maneira fácil de transformar a saída do método da classe base para o resultado desejado.

  • A classe de base é um padrão usando estratégia ou uma sua variante, de modo que basta fornecer uma implementação alternativa da porção adequada da estratégia.

Infelizmente, não soa como um desses é o caso aqui, então você pode ter que escrevê-lo a partir do zero.

Então, o meu entendimento é que eu crio meu controle, derivando a partir da base controlar - e eu posso escrever o meu próprio FormatTags () Método? - que é correto

Absolutamente correto.

Se você está achando que você está precisando para copiar um monte de código ao redor, você deve olhar para reestruturar o seu método. Coloque o código que está sendo copiado para outro método que você não vai substituir, e então quando você substituir FormatTags, mudança que você precisa e acesso apenas que o código que você teria copiado chamando o outro método.

Dê uma olhada métodos de extensão . Estes sistemas permitem ampliar a capacidade de uma classe selada que você não pode editar ou estender, através da definição de sua função em sua própria classe estática. Aqui está um exemplo que eu acabei de escrever (pode ter erros de sintaxe).

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

Agora, para aceder a este, eu posso simplesmente chamar:

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

string myResult = myString.AppendCrazyText(myCrazyText);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top