我问一个问题有关的接口之前,得到了一些良好的反应。我真的很兴奋地开始开展真正的灵活代码。

我现在有一个问题是关于压倒一切的虚拟方法。

我目前的工作,与社区服务器软件开发工具包。一项控制是一个"标记"面包屑。因此,它将列出的"标签"的相关对象。

<CSBlog:TagBreadCrumb />

我使用的标签,以允许管理员为目标的特定地点内容出现在布局,但是那些标记不是相关的终端用户。例如,'Home_Main'的标签用于目标的主要小组的主页,但我不想用户看到这一点。

因为我有SDK for社区服务器,我发现的控制呈现的'标记名单'和所作的修改,对它做什么我想要的-但是我的理解是,这不良好的修改核心的原因很多。

所以我想要做的是创造我自己的控制,这基本上是几乎100%相同的基本控制,但复盖的一种方法。

这里是方法:

 public virtual string FormatTags(string[] tagList)

里面有代码格式的标记,和我想写我自己的代码该做所有的相同的东西,除了检查结构的文件,为"标签",以排除。

因此,我的理解是,我创造了我的控制,源于基地控制-并且我可以写我自己的FormatTags()方法是正确的?

我只需要改变的一个方面,但这是不是意味着我复制的原始代码为这一方法从基类和改变什么,我需要在那里?它只是感觉不对copyign码从一个地方,但是我不知道的另一种方式来扩展的方法没有改变码的基类。

谢谢你的任何建议。

有帮助吗?

解决方案

可以仍然运行衍生方法和其结果进行操作:

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