在C#中将对象转换为子类

5

我在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()) 创建的对象添加一些方法。


1
将方法添加到对象的唯一方法是使用继承(子类)或使用扩展方法,它们看起来就像是对象上的方法。 - John Gardner
相关内容:https://softwareengineering.stackexchange.com/questions/366592/what-is-a-proper-use-of-downcasting合适的下转型使用是什么? - ryanwebjackson
6个回答

6

您不能这样做。

考虑以下示例:

class Fruit {
    // bla
}

class Banana : Fruit {
    // bla
}

以下内容是不可能的。
Fruit f = new Fruit();
Banana b = (Banana)f;

因为并非所有水果都是香蕉。


3
这是不可能的。 多态性 是反过来的方式 - 使用一个派生类,就像它是更通用的父类。
然而,可以向现有类添加方法。 这被称为扩展方法。 然而,它将添加到编写以扩展其的类的所有实例中。

2

你不能这样做。你声明的是 Child 继承自 Parent。但没有任何说法 Parent 必须是 Child。

如果你使用 Parent p = new Child(),那么强制转换就没问题了。

如果你想要向一个已有的对象添加方法,我建议你研究一下 扩展方法,因为它们被创建的目的就是为了扩展你无法修改的类。


0

只有在对象首先由子类构造函数初始化时,才能将父类转换为子类。 这适用于所有 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


0

你的基类引用所指向的实例并不是你的子类的实例。

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;  
    }
}

0
你正在讨论多态的概念。你所请求的不可能。原因很明显,稍作解释即可:
子类被允许按照自己的意愿扩展父类的功能... 添加大量新方法和属性等... 子类是父类的超集。因此将父类转换为子类将留下未覆盖的子集部分-对于子类的新成员、方法和属性没有定义功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接