首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接口继承问题

接口继承问题
EN

Stack Overflow用户
提问于 2022-09-16 19:16:04
回答 2查看 49关注 0票数 1

我有IBinaryNode接口和IRedBlackNode接口,它们继承自IBinaryNode。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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; }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-16 19:46:50

实际上,您不能这样做。假设您有一个RedBlackNode实例,那么可以将它转换为IBinaryNode<T>,并且可以将任何其他IBinaryNode<T>分配给它的Right属性。

但是,如果要限制类RedBlackNodeRight属性中只有IRedBlackNode<T>的实例,则可以通过显式接口实现来实现:

代码语言:javascript
复制
public IRedBlackNode<T> Right { get; set; }

IBinaryNode<T> IBinaryNode<T>.Right
{
  get => Right;
  set => Right = (IRedBlackNode<T>)value;
}

如果只有LeftRight上的getter,它将通过协方差工作,但也有setter。

票数 1
EN

Stack Overflow用户

发布于 2022-09-16 20:19:57

我想它还能用。下面是一个如何实现该功能的示例。不过,我看不出有什么问题。

代码语言:javascript
复制
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; }
}   
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73749414

复制
相关文章

相似问题

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