C# 在实现接口和继承时确保参数类型

C# 在实现接口和继承时确保参数类型,c#,inheritance,interface,visibility,overload-resolution,C#,Inheritance,Interface,Visibility,Overload Resolution,我对类和接口有问题。 我想实现一个接口声明一个采用实现类类型的方法。 当我从此类继承时,该方法应仅采用继承类的类型 这可能吗 剪短了一段代码: 类程序 { 静态void Main(字符串[]参数) { Node node1=新节点(); Node node2=新节点(); Node node3=新节点(); //将节点2连接到节点1,将节点3连接到节点1。 节点1.连接(节点2) .连接(节点3); SomeNode4=新的SomeNode(); SomeNode5=新的SomeNode();

我对类和接口有问题。 我想实现一个接口声明一个采用实现类类型的方法。 当我从此类继承时,该方法应仅采用继承类的类型

这可能吗

剪短了一段代码:

类程序
{
静态void Main(字符串[]参数)
{
Node node1=新节点();
Node node2=新节点();
Node node3=新节点();
//将节点2连接到节点1,将节点3连接到节点1。
节点1.连接(节点2)
.连接(节点3);
SomeNode4=新的SomeNode();
SomeNode5=新的SomeNode();
节点4.连接(节点5);
//node1.connect(node4);//这应该是不可能的,因为node1.connect()应该只接受Node,而不接受SomeNode。
}
}
接口节点
{
int Id{get;set;}
//这里应该是实现类的类型或子类(或子类…)的类型,而不是INode。
INode连接(INode节点);
}
类节点:INode
{
公共int Id{get;set;}
//此列表必须受到保护,并且只能包含当前类类型的对象。
受保护的连接节点列表;
//这应该实现接口方法,但在子类中,类型不应该是节点,而应该是子类的类型。
//当然,这个方法不应该在子类中重新实现。
公共节点连接(节点)
{
this.connectedNodes.Add(节点);
返回此;//启用链接。
}
}
类SomeNode:Node
{
//这里应该有一些附加功能,但不是connect()方法!
}

通过在节点类型上设置
INode
泛型,并为节点类型使用泛型基类,基本上可以得到您描述的内容。通用节点类型将用于允许单个实现使用不同的类型

interface INode<TNode> {
    int Id { get; set; }
    TNode connect(TNode node); 
}

abstract class NodeBase<TNode> : INode<TNode> {
    public int Id { get; set; }
    protected List<TNode> connectedNodes; 

    public TNode connect(TNode node) {
        this.connectedNodes.Add(node);
        return this; // Enable chaining.
    }
}

class Node : NodeBase<Node> { }

class SomeNode : NodeBase<SomeNode> { }
接口节点{
int Id{get;set;}
TNode连接(TNode节点);
}
抽象类NodeBase:INode{
公共int Id{get;set;}
受保护的连接节点列表;
公共TNode连接(TNode节点){
this.connectedNodes.Add(节点);
返回此;//启用链接。
}
}
类节点:NodeBase{}
类SomeNode:NodeBase{}

然而,这确实创建了一个与您的问题不同的继承结构
SomeNode
不再从
Node
派生,因此
Node n=newsomenode()
不再是值。它们也不再共享单个接口<代码>节点实现<代码>索引节点和<代码>某些节点实现<代码>索引节点,它们是不同的接口

如果可能的话,它可能很难看。例如,如果节点不是节点,则可以引发异常。但这提供了运行时检查,而不是编译时检查。