簡體   English   中英

在c#中將對象轉換為子類

[英]Cast object to subclass in c#

我無法找到 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;

因為不是所有的水果都是香蕉

這是不可能的。 多態在另一個方向上起作用-使用降級類,就好像它是更通用的父級。

但是,可以將方法添加到現有類中。 這稱為擴展方法 但是,它將被添加到編寫擴展的類的所有實例中。

o您不能這樣做。 您聲明孩子從父母那里繼承。 沒有什么說父母必須是孩子。

如果您使用了Parent p = new Child()那么您的類型轉換就可以了。

如果您想向現有對象添加方法,那么我認為您應該研究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類的功能,但是它希望...添加大量新方法和屬性等... childparent超集 因此,將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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM