首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何强制子类实现方法

如何强制子类实现方法
EN

Stack Overflow用户
提问于 2009-11-20 08:48:06
回答 4查看 53.3K关注 0票数 53

我正在创建一个对象结构,我希望基类的所有子类都被强制实现一个方法。

我唯一能想到的办法是:

  1. 是一个抽象类,但是基类有一些有用的助手函数,可以被一些子类使用。
  2. 是一个接口--如果只应用于基类,那么子类就不必只实现基类的函数了。

这有可能吗?

注:这是一个.NET 2应用程序。

EN

回答 4

Stack Overflow用户

发布于 2009-11-20 08:52:37

是一个抽象类--可以工作,但是基类有一些有用的助手函数,这些函数被一些子类使用。

抽象类并不要求它提供的所有函数都是抽象的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
abstract class Base {
    public void Foo() {} // Ordinary method
    public virtual void Bar() {} // Can be overridden
    public abstract void Xyz(); // This one *must* be overridden
}

请注意,如果将public替换为protected,则标记的方法将是仅对基类和子类可见的。

票数 15
EN

Stack Overflow用户

发布于 2009-11-20 09:06:39

接口--如果仅应用于基类,那么子类就不必只实现基类所做的函数。

这并不完全正确。如果基类是抽象的,则可以将属于接口的方法标记为抽象,并强制在子类中实现。

这带来了一个你没有提到的选项:两者都使用。您有一个IFoo接口,并有一个FooBase抽象基类来实现它,或者它的一部分。这为子类提供了接口(或它的一部分)的“默认”实现,还允许您继承其他东西,仍然实现接口,或者如果您想实现接口,但不想继承基类实现。举个例子也许会有帮助:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Your interface
interface IFoo { void A(); void B; }

// A "default" implementation of that interface
abstract class FooBase : IFoo
{
    public abstract void A();

    public void B()
    {
        Console.WriteLine("B");
    }
}

// A class that implements IFoo by reusing FooBase partial implementation
class Foo : FooBase
{
    public override void A()
    {
        Console.WriteLine("A");
    }
}

// This is a different class you may want to inherit from
class Bar
{
    public void C()
    {
        Console.WriteLine("C");
    }
}

// A class that inherits from Bar and implements IFoo
class FooBar : Bar, IFoo
{
    public void A()
    {
        Console.WriteLine("Foobar.A");
    }
    public void B()
    {
        Console.WriteLine("Foobar.B");
    }
}
票数 15
EN

Stack Overflow用户

发布于 2009-11-20 08:50:36

是的,如果您需要这样做的所有类都是现有抽象基类的逻辑子类,那么向基类添加一个抽象方法.这比接口更好,因为它允许您稍后添加实现(通过将抽象基类方法更改为具有默认实现的虚拟方法),如果/当事实证明,比方说,十个派生类中的八个将具有相同的实现时,则其中只有两个不同.

编辑:(基于下面注释中的线程)必须将基类声明为抽象类才能这样做.在非抽象类中不能有抽象方法,因为可以实例化非抽象类,如果创建了非抽象类的实例,则该方法将没有实现。所以这是违法的。通过将基声明为抽象,可以抑制类的实例化。然后,只能实例化非抽象派生类,其中(因为基本方法是抽象的)必须为该方法添加一个实现。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1771741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文