【发布时间】:2016-01-24 23:57:01
【问题描述】:
谁能解释一下当您从抽象/界面转换到界面时,幕后究竟发生了什么?
示例:假设AbstractClasse a = new Concrete() 和Concrete 同时实现了IText 接口和AbstractClasse,我们说IText = (IText)a。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
interface IText
{
string ToText();
}
class Subtip : SubtitleFormat, IText
{
public int Error { get; set; }
public Subtip(int error)
{
Error = error;
}
public string ToText()
{
return $"{Error}, Hello!";
}
}
abstract class SubtitleFormat
{
protected int _errorCount = 1;
public int ErrorCount
{
get
{
return _errorCount;
}
}
}
static void Main(string[] args)
{
SubtitleFormat sb = new Subtip(10);
IText sb2 = sb as IText;
Console.WriteLine(sb.ErrorCount);
Console.WriteLine((sb as Subtip).Error);
Console.WriteLine(sb2.ToText());
Console.ReadLine();
}
}
}
【问题讨论】:
-
对于初学者来说,
as关键字与强制转换不同,如果无法进行强制转换并且通常速度较慢,则强制转换将引发异常。要回答您的问题,尽管as关键字生成为 isinst IL 指令,这会导致 VM 调用遍历类类型的继承列表的例程以及 VM 创建的包含类实现的所有接口的单独数组。
标签: c# interface polymorphism abstract