首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么将基对象转换为派生类型引用工作?

为什么将基对象转换为派生类型引用工作?
EN

Stack Overflow用户
提问于 2014-03-27 11:33:10
回答 1查看 141关注 0票数 0

AFAIK将基类对象转换为派生类型引用,在下面的类中抛出一个运行时exception.But,这非常好。

代码语言:javascript
复制
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的一个示例中提取的代码。

根据我的理解,在property中,离开了

代码语言:javascript
复制
(BinaryTreeNode<T>) base.Neighbors[0]

将(基)节点转换为(派生) BinartTreeNode。这是怎么回事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-27 11:37:24

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22686352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档