2009-08-25 60 views
5

有像这样的:如何使用方法实现基类并强制派生类覆盖它?

public abstract class AAA 
{ 
    protected abstract virtual string ToString() // Error 
    { 
    // Base Stuff 
    } 
} 

public abstract class BBB : AAA 
{ 
    public override string ToString() 
    { 
    // Use base.ToString(); 
    // More Stuff 
    } 
} 

我读到另一篇文章(abstract method in a virtual class)女巫是相当喜欢我的问题,但有一点区别。我想AAA.ToString()有一个基本行为强制派生类来覆盖它。

我知道我可以做这样的事情(向下滚动),但我正在寻找一个合适的方式。

public abstract class AAA 
{ 
    public abstract string ToString(); 
    protected string ToString2() 
    { 
    // Base Stuff 
    } 
} 

public class BBB : AAA 
{ 
    public override string ToString() 
    { 
    // Use base.ToString2(); 
    // More Stuff 
    } 
} 

我也大概可以做一个IAAA接口,并建立我的BBB级像

public class BBB : AAA, IAAA { ... } 

但不看我的权利。

回答

5

你的方法本质上是正确的方法...

编辑:

你的 “规范” 是:

  1. 默认行为
  2. 需要覆盖

现在,因为你的应用程序耳朵要始终执行的“默认行为”,你需要

public string ToString() 
{ 
    // placeholder for some default behaviour 

    string result = doToString(); 

    // placeholder for some more default behaviour 

    return result; 
} 

protected abstract string doToString(); 

这只能如果你知道基类一般做,并希望提供实现在派生类中doToString()。这就是所谓的Template Method设计模式。

但是,如果你正在寻找一种方式来需要派生类的实施者调用base.ToString()在其实施的ToString(),那么就没有办法做到这一点。通过允许覆盖,您可以对派生类的实现进行控制。

您可以记录您的建议,始终致电base.ToString(),但就是这样。

使用接口定义您的班级的公共合同。由于您仍然需要从基类派生以获取“默认”实现,因此这不会为Template Method模式带来额外的好处。

你有没有关于你想在基类中提供什么作为“默认行为”的细节?也许这将有助于获得更好的解决方案。看看引用的问题,这基本上是相同的方法。

+0

谢谢,您的编辑让我意识到一些重要的东西!即使我会找到奇迹的方式来在基类中定义ToString()并强制派生类中的重写,但我根本没有办法强制重写使用ToString()!我还发现了一个关于强制覆盖的MVP的帖子:http://social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/c25b6477-b990-4284-abaf-801ddf18207c。再次感谢先生。 – Tipx 2009-08-25 03:46:25

+0

很高兴为您服务。这篇文章是由Marc Gravell撰写的......他也很出名:) – 2009-08-25 04:07:10

+0

这与以下张贴的答案比较如何? – Armbrat 2009-08-26 00:45:19

0

不,不可能将当前的虚拟函数变成抽象函数。正如你所建议的那样,执行此操作的唯一方法是创建另一个抽象的函数。这可以说是一个更合适的方法(我同意这一点)。

2

我刚刚找到了如何做才能得到完全我想要的行为:

public abstract class AAA 
{ 
    protected abstract string ToStringSpecific(); 
    protected string ToString() 
    { 
    // Base Stuff 
    ... 
    // Use this.ToStringSpecific(); 
    } 
} 

public class BBB : AAA 
{ 
    protected override string ToStringSpecific() 
    { 
    // Specific Stuff 
    } 
} 
+0

我认为你应该编辑你原来的问题... – Armbrat 2009-08-26 00:44:49

+0

我确实会编辑问题(和标题),以便它可以帮助某人找到这个主题,但我会让我的解决方案在这里。 (如果不这样做,就不会有e“Anwser Your Question”按钮) – Tipx 2009-08-26 03:06:26

+0

我只是重读了我评论的第二部分,它“听起来”很傲慢。我很抱歉,我不是故意的,我不能编辑评论。我道歉。 – Tipx 2009-08-26 03:13:02

相关问题