从超类C#返回子类的“ this”

时间:2019-04-02 15:40:34

标签: c# oop

我需要从超类返回“ this”或子类实例。

interface IA
{
    IA Format();
    void Print();
}
interface IB
{
    IA Format();
    void Print();
    void PrintB();
}
abstract class A : IA
{
    protected bool isFormated;
    public IA Format()
    {
        isFormated = true; 
        return this;
    }
    virtual public void Print()
    {
        Console.WriteLine("this is A");
    }
}

class B : A, IB
{
    override public void Print()
    {
        Console.WriteLine("this is B");
    }
    public void PrintB()
    {
        if (isFormated)
        {
            Console.WriteLine("this is formated B");
        }
        else
        {
            Console.WriteLine("this is B");
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        var x = new B();
        x.Format().PrintB();
    }
}

我有两个类,类A是超类,而类B是从A继承的子类。 这两个实现接口A和B的类。

我需要调用'x.Format()。PrintB();'只是为了格式化字符串。

换句话说,我需要在Format()函数中返回相同的对象,并且根据Format()中的更改,我需要更改PrintB行为。

因此,如果我创建了新的D类并继承了A类,我也想基于isFormated实现具有不同行为的PrintD。

2 个答案:

答案 0 :(得分:0)

调用x.Next()时,它将返回实现IA的对象的实例。可以是AB或实现IA的任何其他类,但是由于它返回IA,因此其他类不知道具体的类型是什么。这通常是故意的。如果其他类不知道IA的实现是什么,则可以用另一个替换。

但是,由于Next返回了IA,因此您可以调用PrintB的唯一方法是如果IA具有PrintB方法,如下所示:< / p>

public interface IA
{
    void PrintB();
}

如果A实现IA,则它必须具有PrintB方法。但是因为它是abstract类,所以该方法可以是抽象的。这意味着A并未真正实现该方法。从A继承的非抽象类将需要实现。

它看起来像这样:

abstract class A : IA
{
    public IA Next()
    {
        return this;
    }
    virtual public void Print()
    {
        Console.WriteLine("this is A");
    }

    public abstract void PrintB();
}

PrintB不必是抽象的。 A可以实现它。它可以是虚拟的,其他类可以覆盖它。或者它既不是抽象的也不是虚拟的,而其他类则不能覆盖它。

现在,当您声明B : A时,编译器将要求B来实现PrintB

然后您可以调用Next().PrintB(),因为Next()返回IA,并且IA具有PrintB方法。

答案 1 :(得分:0)

我使A作为通用类采用类型T,并将其返回为T

<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/sankey.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>

<div id="container"></div>