我有IBinaryNode接口和IRedBlackNode接口,它们继承自IBinaryNode。
public interface IBinaryNode<T>
{
public IBinaryNode<T>? Left { get; set; }
public IBinaryNode<T>? Right { get; set; }
public T Value { get; }
}
public interface IRedBlackNode<T> : IBinaryNode<T>
{
IRedBlackNode<T>? Parent { get; set; }
bool IsBlack { get; set; }
}如何在以下类的属性中使用IRedBlackNode而不是IBinaryNode?我认为,如果IRedBlackNode实现了IBinaryNode,那么我就可以这样做,但我得到的类型错误表明,它必须是IBinaryNode。
private class RedBlackNode : IRedBlackNode<T>
{
public IRedBlackNode<T>? Parent { get; set; }
public IRedBlackNode<T>? Left { get; set; }
public IRedBlackNode<T>? Right { get; set; }
public bool IsBlack { get; set; }
public T Value { get; }
}发布于 2022-09-16 19:46:50
实际上,您不能这样做。假设您有一个RedBlackNode实例,那么可以将它转换为IBinaryNode<T>,并且可以将任何其他IBinaryNode<T>分配给它的Right属性。
但是,如果要限制类RedBlackNode的Right属性中只有IRedBlackNode<T>的实例,则可以通过显式接口实现来实现:
public IRedBlackNode<T> Right { get; set; }
IBinaryNode<T> IBinaryNode<T>.Right
{
get => Right;
set => Right = (IRedBlackNode<T>)value;
}如果只有Left和Right上的getter,它将通过协方差工作,但也有setter。
发布于 2022-09-16 20:19:57
我想它还能用。下面是一个如何实现该功能的示例。不过,我看不出有什么问题。
public interface IBinaryNode<T>
where T : class
{
public IBinaryNode<T>? Left { get; set; }
public IBinaryNode<T>? Right { get; set; }
public T Value { get; }
}
public interface IRedBlackNode<T> : IBinaryNode<T>
where T : class
{
IRedBlackNode<T>? Parent { get; set; }
bool IsBlack { get; set; }
}
public class RedBlackNode<T> : IRedBlackNode<T>
where T: class
{
public IRedBlackNode<T>? Parent { get; set;}
public IBinaryNode<T>? Right { get; set }
public IBinaryNode<T>? Left { get; set ; }
public bool IsBlack { get; set; }
public T Value { get; }
} https://stackoverflow.com/questions/73749414
复制相似问题