Dai*_*Dai 3 c# inheritance casting
在C#中,我处于环境提供的以下类型的场景中:
public interface IFoo {
}
public abstract class Base {
}
public class Derived : Base, IFoo {
}
public class Arbitrary {
public Base GetBase() { }
}
Run Code Online (Sandbox Code Playgroud)
这是我写的除此之外的内容.请注意,我可以在我的代码,保证Arbitrary.GetBase()将始终返回的一个实例Derived.
public class Arbitrary2 : Arbitrary {
public IFoo GetDerived() {
return (IFoo)base.GetBase();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,此代码失败,并显示消息"无法将类型'Base'转换为'IFoo'".
但如果我这样做,那么它的工作原理:
public class Arbitrary2 : Arbitrary {
public IFoo GetDerived() {
Object baseAsObject = base.GetBase();
return (IFoo)baseAsObject ;
}
}
Run Code Online (Sandbox Code Playgroud)
为什么在我将它转发给IFoo之前需要将此向上转换为对象?这两段代码在功能上是相同的,如果转换无效,后者将在运行时可靠地崩溃.我不明白为什么编译器会抱怨.
你不需要这样做.您的代码应该按原样运行.有关详细信息,请参阅此计
using System;
public interface IFoo { }
public abstract class Base { }
public class Derived : Base, IFoo { }
public class Arbitrary {
public Base GetBase() { return new Derived(); }
}
public class Arbitrary2 : Arbitrary {
public IFoo GetDerived() {
return (IFoo)base.GetBase();
}
}
class Program
{
static void Main(string[] args)
{
Arbitrary2 test = new Arbitrary2();
IFoo check = test.GetDerived();
Console.WriteLine(check.GetType().Name);
Console.WriteLine("Press key to exit:");
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud)