从抽象转换为界面时会发生什么?

时间:2016-01-24 23:57:01

标签: c# interface polymorphism abstract

当你从抽象/接口转换到接口时,有没有人可以解释场景背后的真实情况?
示例:假设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();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

当您转换为接口或类时,使用正确类型的对象来确定它是否与目标兼容。目前输入的对象与objectinterface,最终class或基本class无关。

所以,例如,你可以这样做:

SubtitleFormat sb = new Subtip(10);
IText sb2 = sb as IText;
Subtip sb3 = sb2 as Subtip;

这两个转换都是有效的,因此在它结束时sb3将具有非空值。所有三个变量(sbsb2sb3)都将引用同一个对象,因此Object.ReferenceEquals(sb, sb3)将为真。

因为对象实例的真实类型用于确定转换是否有效,所以不会工作:

public class NotIText : SubtitleFormat
{
    public string ToText()
    {
        return "";
    }
}

static void Main(string[] args)
{
    SubtitleFormat sb = new NotIText();
    IText sb2 = sb as IText;
}

答案 1 :(得分:0)

类类型的值可以转换为类型对象或由类实现的接口类型,只需在编译时将引用视为另一种类型即可。同样,类型对象的值或接口类型的值可以转换回类类型而不更改引用(但在这种情况下,当然需要运行时类型检查)。

来源 CSharp语言规范