c# - Cast 接口(interface)和类对象

标签 c# .net oop inheritance

像这个例子一样,将对象转换为接口(interface)将对象转换为类有什么区别。

namespace ConsoleApplication1
{
    interface IAnimal
    {
        string Sound();
    }

    class Animal : IAnimal
    {
        public string Sound()
        {
            return "Animal sound";
        }
    }

    class Lion : Animal, IAnimal
    {
        public string Sound()
        {
            return "Roarrrrr";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Lion lion = new Lion();
            IAnimal animal = (Animal)lion; // variant 1

            IAnimal animal2 = (IAnimal)lion; // variant 2

            Console.WriteLine(animal.Sound());
        }
    }
}

变体 1 和变体 2 有什么区别?

最佳答案

唯一的区别在于编译器如何检查是否允许转换。

在第一个变体中,编译器检查如何将 Lion 转换为 Animal,然后检查如何将 Animal 转换为 IAnimal。由于 Lion 是一个 AnimalAnimal 是一个 IAnimal,因此两种转换都可以安全地完成,编译器不会生成根本没有用于转换的代码,它只是一个任务。

在第二个变体中,编译器检查如何将 Lion 转换为 IAnimal,然后检查 IAnimal 是否与 相同>IAnimal。由于转换可以安全地完成,它也不会生成用于转换的代码,它也只是一个赋值。

由于 Lion 是一个 IAnimal,您根本不需要进行任何转换,只需将其分配给变量即可:

IAnimal animal3 = lion;

在这种情况下,编译器将检查如何将 Lion 转换为 IAnimal,并且由于可以安全地完成,它不会生成任何转换代码,只是作业。

关于c# - Cast 接口(interface)和类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23590562/

相关文章:

javascript - 在 Javascript ES6 的子类中扩展父类方法

C#/Exchange 电子邮件客户端

c# - 我可以将错误处理合并到我的 API 中吗?

c# - 使用文本框上的 OnChange 事件进行简单显示

.net - 使用 SQLite 和 WinForms 2.0 C# 的编码问题

android - WebSocket 在几个时间间隔之间不断断开连接

c# - 使用 http 触发的函数将输入绑定(bind)到表存储

C#:解决继承类与其基类之间的无效转换异常

php - 在PHP中将调用类捕获到层次结构中

java - 如何在 Android Studio 中使用 Java 中自己的对象创建数组。