为什么将基对象转换为派生类型引用有效

本文关键字:派生 类型 引用 有效 转换 对象 为什么 | 更新日期: 2023-09-27 17:54:12

当然,将基类对象强制转换为派生类型引用会抛出运行时异常。但是在下面的类中,这工作得很好。

public class Node<T>
{
        // Private member-variables
        private T data;
        private NodeList<T> neighbors = null;
        public Node() {}
        public Node(T data) : this(data, null) {}
        public Node(T data, NodeList<T> neighbors)
        {
            this.data = data;
            this.neighbors = neighbors;
        }
        public T Value
        {
            get
            {
                return data;
            }
            set
            {
                data = value;
            }
        }
        protected NodeList<T> Neighbors
        {
            get
            {
                return neighbors;
            }
            set
            {
                neighbors = value;
            }
        }
    }
}   
public class BinaryTreeNode<T> : Node<T>
{
    public BinaryTreeNode() : base() {}
    public BinaryTreeNode(T data) : base(data, null) {}
    public BinaryTreeNode(T data, BinaryTreeNode<T> left, BinaryTreeNode<T> right)
    {
        base.Value = data;
        NodeList<T> children = new NodeList<T>(2);
        children[0] = left;
        children[1] = right;
    base.Neighbors = children;
}
public BinaryTreeNode<T> Left
{
    get
    {
        if (base.Neighbors == null)
            return null;
        else
            return (BinaryTreeNode<T>) base.Neighbors[0];
    }
    set
    {
        if (base.Neighbors == null)
            base.Neighbors = new NodeList<T>(2);
        base.Neighbors[0] = value;
    }
}

这是来自MSDN - http://msdn.microsoft.com/en-us/library/ms379572(v=vs.80).aspx

的一个示例代码

根据我的理解,In property Left

(BinaryTreeNode<T>) base.Neighbors[0]

将(基本)节点强制转换为(派生)BinartTreeNode。

为什么将基对象转换为派生类型引用有效

正是因为它可以工作,我们可以得出结论,所讨论的对象实际上是BinaryTreeNode<T>(或其子类)。对象一旦创建就永远不会改变类型,所以在某个地方(没有在您的示例中显示)您正在创建BinaryTreeNode<T>,将其存储为邻居(我们所知道的是它是Node<T> -这很好:说任何BinaryTreeNode<T>都是Node<T>是正确的;类继承意味着"是一个"),然后成功地再次将其强制转换回来。这是合法的,但如果节点不是BinaryTreeNode<T>,则在运行时失败。