在c#中将对象强制转换为子类
本文关键字:转换 子类 对象 | 更新日期: 2023-09-27 18:18:12
我还没有找到一个关于c#的帖子。有什么办法可以做到这一点吗?
class parent {
public parent() { }
}
class child : parent {
public child() { }
}
class Program {
static void Main(string[] args) {
parent p = new parent();
child c = (child)p;
}
}
我想这样做的原因是添加一些方法的对象,是通过调用一个函数(UIGraphics.GetCurrentContext())
。
你不能那样做。
考虑这个例子:
class Fruit {
// bla
}
class Banana : Fruit {
// bla
}
以下是不可能的
Fruit f = new Fruit();
Banana b = (Banana)f;
因为不是所有的水果都是香蕉
这不可能。多态性在另一个方向上工作-使用一个派生类,就好像它是更通用的父类。
但是,可以向现有的类添加方法。这被称为扩展方法。但是,它将被添加到它要扩展的类的所有实例中。
你不能这么做。你的声明是Child继承自Parent。没有人说父母必须是孩子。
如果您使用了Parent p = new Child()
,那么您的cast将是可以的。
如果你想在现有对象中添加方法,那么我认为你应该研究Extension methods
,因为它们是为了扩展你不能修改的类而创建的。
基类引用引用的实例不是子类的实例。
Parent c = new child();
Parent p = new parent();
Child good = (Child )c; // OK
Child fail = (Child )p; // Throws InvalidCastException
要使转换成功,要向下转换的实例必须是要向下转换到的类的实例。
要使其工作,您必须做以下操作:
class Program {
static void Main(string[] args) {
parent p = new child();
child c = (child)p;
}
}
您正在讨论多态性的概念。你的要求是不可能的。简单解释一下,原因就很明显了:
允许child
类扩展parent
类的功能,但它想…添加了大量的新方法和属性等等……child
是parent
的超集。因此,将parent
转换为child
会留下一部分未覆盖的超集—将没有为子元素的新成员、方法和属性定义的功能。
如果对象首先由子构造函数初始化,则只能从父类强制转换为子类。通过多态性,这在所有OOP语言中都是相同的。这里你可以看到一个例子:
class parent {
public parent() { }
}
class child : parent {
public child() { }
}
class Program {
static void Main(string[] args) {
parent p = new child();
child c = (child)p;
}
}
要检查实例是否由特定的类发起,可以使用操作符:is