c# - 继承时使用基类

标签 c# oop

<分区>

如何将返回基类型的基类的功能提取到继承类中?

我有一个基类 Chapter 和一个子类 EnhancedChapter,它向 Chapter 添加了一些功能。

不幸的是,一个基类方法返回类类型。我可以在子类中访问此方法,但由于它返回基类型而不是子类型,因此我无法将其功能引入子类。

这是基类(Page 在别处实现,你会得到图片):

class Chapter
{
    public List<Page> pages;

    public Chapter()
    {
        pages = new List<Page>();
    }

    public Chapter CalculatedChapter(DateTime date)
    {
        pages.ForEach(p => p.CalculatedPage(date));
        return this;
    }
}

这是子类:

class EnhancedChapter : Chapter
{
    public int? PageCount()
    {
        if (pages != null) return pages.Count; else return null;
    }
}

现在,当我想在子类中使用 CalculatedChapter() 时,我遇到了问题:

EnhancedChapter enhancedChapter;
// won't work, returns Chapter not EnhancedChapter
enhancedChapter = new EnhancedChapter().CalculatedChapter(DateTime.Now);

我想到了一些选项,但并不适合我:我可以在这里进行强制转换,但这似乎很容易出错。我还考虑过以某种方式将 CalculatedChapter() 的结果提供给子类构造函数,但不知道该怎么做。

最佳答案

认为这会做到...

abstract class ChapterBase<T> where T : ChapterBase<T>
{
    public List<Page> pages;

    public ChapterBase()
    {
        pages = new List<Page>();
    }

    public T CalculatedChapter(DateTime date)
    {
        pages.ForEach(p => p.CalculatedPage(date));
        return (T)this;
    }

}

class Chapter :ChapterBase<Chapter>
{
}

class EnhancedChapter : ChapterBase<EnhancedChapter>
{
    public int? PageCount()
    {
        if (pages != null) return pages.Count; else return null;
    }
}

关于c# - 继承时使用基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37195723/

相关文章:

c# - 参数未绑定(bind)的 Caliburn.Micro Action

c# - DevExpress 日期选择器没有日期

c# - Discord.Net GetUser 按 Id 返回 null

java - Java如何在JVM中创建对象?当我调用构造函数时,堆栈和堆上会发生什么?

c# - 我无法在 C# 中将变量添加到 WebRequest

c# - 在 Unity 编辑器中使用 AddComponent 脚本撤消移除游戏对象(播放模式)

c# - 如何动态决定使用哪个静态类

php - 在这种简单的情况下,PHP 拒绝接受返回类型的原因是什么?

oop - 逻辑设计与物理设计

oop - 产品类职责