2015-09-04 60 views
0

我遇到类和接口问题。 我想实现一个接口声明一个方法,它采用实现的类的类型。 当我从这个类继承时,该方法应该只采用继承类的类型。确保实现接口和继承时的参数类型

这可能吗?

短代码剪断:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Node node1 = new Node(); 
     Node node2 = new Node(); 
     Node node3 = new Node(); 

     // Connect node2 to node1 and node3 to node1. 
     node1.connect(node2) 
      .connect(node3); 

     SomeNode node4 = new SomeNode(); 
     SomeNode node5 = new SomeNode(); 

     node4.connect(node5); 

     // node1.connect(node4); // This should not be possible because node1.connect() should only accept Node and not SomeNode. 
    } 
} 

interface INode 
{ 
    int Id { get; set; } 

    // Instead of INode, here should be the type of the implementing class or the type of the subclass (or the sub-subclass ...). 
    INode connect(INode node); 
} 

class Node : INode 
{ 
    public int Id { get; set; } 

    // This list MUST be protected and MUST be able to contain only objects of the current class type. 
    protected List<Node> connectedNodes; 

    // This should implement the interface mehtod but in subclasses, the type should not be Node but the type of the subclass. 
    // Of cause, this method should not be reimplemented in subclasses. 
    public Node connect(Node node) 
    { 
     this.connectedNodes.Add(node); 

     return this; // Enable chaining. 
    } 
} 

class SomeNode : Node 
{ 
    // Here should be some additional functionality but NOT the connect() method! 
} 
+0

如果可能,它可能很丑。例如,如果节点不是节点,则可以引发异常。但是,这给运行时和不编译时间检查。 –

回答

0

你可以得到你基本上通过使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> { } 

但这不过创造比你在你的问题不同的继承结构。 SomeNode不再来自Node因此Node n = new SomeNode()不再有价值。他们也不再共享一个界面。 Node实现INode<Node>SomeNode实现INode<SomeNode>这是不同的接口。

相关问题