我需要从超类返回“ 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。
答案 0 :(得分:0)
调用x.Next()
时,它将返回实现IA
的对象的实例。可以是A
,B
或实现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>