AFAIK将基类对象转换为派生类型引用,在下面的类中抛出一个运行时exception.But,这非常好。
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中,离开了
(BinaryTreeNode<T>) base.Neighbors[0]将(基)节点转换为(派生) BinartTreeNode。这是怎么回事?
发布于 2014-03-27 11:37:24
正因为它有效,我们可以得出结论,所讨论的对象实际上是一个BinaryTreeNode<T> (或该对象的一个子类)。对象一旦创建,就不会更改类型,因此在某个地方(在您的示例中没有显示),您正在创建一个BinaryTreeNode<T>,将其存储为邻居(我们只知道它是一个Node<T> --这很好:可以说任何BinaryTreeNode<T>都是Node<T>;类继承意味着“是一个”),然后再次成功地将其转换回来。这是合法的,但如果节点被证明为而不是是BinaryTreeNode<T>,则在运行时将失败。
https://stackoverflow.com/questions/22686352
复制相似问题