接口中的C#铸造类型
本文关键字:类型 接口 | 更新日期: 2023-09-27 18:30:04
我想创建一组非常相似的类,这些类可以转换为其他类型。我的想法是创建一个Interface对象,并通过基类实现它。然后创建从我的基础继承的其他类。然后,我可以使用Interface来处理公共(基本)方法,并将对象从base对象强制转换为自定义类型。
interface ImyInterface {
}
public class MyBase : ImyInterface {
}
public class MyCustom1 : MyBase {
}
public class MyCustom2 : MyBase {
}
// in helper class
public static MyBase GetGeneralOjbect() {
// get a generic base object
return new MyBase();
}
// How I'm trying to use this
MyCustom1 obj = GetGeneralOjbect() as MyCustom1;
除了对象语句的强制转换之外,这似乎是可行的。即使静态帮助程序GetGeneralOjbect返回一个好的MyBase对象,MyCustom1也始终为null。也许这是做不到的,或者我做得不对。任何意见都将不胜感激。
这是因为可以将MyCustom1
或MyCustom2
强制转换为MyBase
,但不一定相反。
通过MyBase b = new MyBase();
创建MyBase
时,b
是MyBase
,而不是MyCustom2
,因此将b
强制转换为MyCustom2
将失败。
可以做的是:
MyBase b = new MyCustom2();
MyCustom2 c = b as MyCustom2();
不能做的是:
MyBase b = new MyCustom2();
MyCustom1 c = b as MyCustom1();
"as"关键字表示"如果这个静态类型为MyBase的对象的运行时类型为MyCustom1,则将其返回给静态类型为MySCustom1的我;否则,给我一个null引用"。您正在转换的对象的运行时类型为MyBase,而不是MyCustom1,这就是您获得null引用的原因。
基本上,你可以向上抛出继承链,但不能向下抛出。假设你有以下类继承:
public class A {
}
public class B : A {
}
public class C : B {
}
如果您实例化了一个类型为B的新实例,则可以将其强制转换为a,而不是C。
您是否考虑过使用工厂模式?
只要需要MyBase
的实例,就可以使用MyCustom1
的实例,但如果需要MyCustom1
,就不能使用MyBase
。