2013-10-16 24 views
0

我在C#中的一些练习,我不明白的大局。如果这些应该在Java中实现,我没有问题。但我在C#中是新手,所以混淆了一些东西,我不知道te结构应该是什么样子。我看了一些explanasions,如: http://www.codeproject.com/Articles/15360/Implementing-IDisposable-and-the-Dispose-Pattern-Phttp://msdn.microsoft.com/en-us/library/fs2xkftw.aspxC#类,subclases,IClonable,IDisposable

我有一流的,我做的LinkedList和ITST类型为节点,所以: LinkedList的链表=新的LinkedList 比我一些使菩提它的一些节点链表方法也在这里是方法print,它从链表打印元素。我的“对象”类是Node,其中我有构造函数,属性以及getter和setter。我有allso这里virtula方法打印,我不知道是什么shoudl我把这种方法,becuse这个节点类就是抽象类,在这里,我必须实现IDisposable方法:

public void Dispose() {} 
protected virtual void Dispose(bool disposing) {} 

这里,我并不undrsetend为什么我应该使用IDispose?在我看到的所有示例中,它都用于访问某个文件并处理图片。在一些例子中,我看到:

public interface IDisposable 
{ 
    void Dispose(); 
} 

,我不知道如果我必须把这个在一些新的类,我shuld把它在同级别,甚至没有实现它。

而且我做了NodeLong和Nodestring的子类,它使用超类节点,我把一些新的属性和setters和getters。我也使用了打印方法。 我也不明白genercis。

Linearcollection类:

public class LinearCollection{ 
    void Main(string[] args){ 
     LinkedList<Node> linkedlist = new LinkedList<Node> 
      //calling methods for adding some elements, deleting, getting some elements 
    } 
    //implemented methods 

    public void Print(){ 
     foreach(NodeElement item in linkedList){ 
       // what to do?? 
     } 
    } 

我Nodeelemts类:

public abstract class Node:{ 

    private bool _disposed; 
    //constructors 
    //properties, set, get ex: 
    private Object data; 
    public Object _data{ 
     get{ 
      rethurn this._data; 
     } 
     set{ 
      this._data=value; 
     } 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing){ 
     if(!_disposed){ 
      if(disposing){ 
       //disposed managed resources 
      } 
      // 
     } 
     _disposed = true; 
     // 
    } 

    virtual public void Print(){ 
     //what to implemetn? 
    } 
} 
//stil the same file 
public class NodeString : Node{ 
    //prop 
    public string typeOfElement{ get set ...} 
    //new constructor where is involved new property 
    public overrride void Print() 
    { 
     Console.WriteLine(_data.ToString()); 
     base.Print(); 
    } 
} 

public class NodeLong : Node{ 
    //prop 
    public long typeOfElement{ get set ...} 
    //new constructor where is involved new property 
    public overrride void Print() 
    { 
     Console.WriteLine(_data.ToString()); 
     base.Print(); 
    } 
} 

如果我让NodeLang:IClonable比我不能让NodeLang:节点。

我的指示说我必须在两个子类中使用IClonable方法,我不知道该如何使用它?如何在类Node中使用IDisposable?我希望我能理解吗?

所以最后的问题是它应该看起来像我的类,子类,IDisposable和ICloneable?

+3

你的导师要求你做一些你在现实世界中不会做的事情。如果该类拥有非托管资源(如网络连接或数据库连接),则只应在类上实现IDisposable。 –

+0

这个班的结构怎么样呢? – wanttobeprofessional

+0

如果我使用genercis,这看起来会如何,但我不是很赞,我明白通用是什么... – wanttobeprofessional

回答

0

有些时候,它可能为它实现IDisposable有一个克隆方法的类是有意义的,其中的任何代码调用克隆方法情况下,对象将负责确保Dispose将调用新副本(或通过自己拨打Dispose,或将责任交给其他代码)。有些情况下,有一个容器类有一个Dispose方法,其中存储的每个成员都会调用Dispose,尽管在大多数情况下,容器类的目的是围绕这种处理,并且没有任何理由以支持任何形式的克隆。

除非Node类将暴露于外部世界,我没有看到它实施IDisposable很多目的。即使持有链表的类是一个处置聚合器(接收其使用寿命比其自身短的对象,然后在调用它自己的Dispose方法时清除它们的对象),并且除最后一个节点之外的每个节点不仅会持有需要清理的东西,但也会知道另一个节点。在下一个节点上调用节点Dispose会导致不必要的递归,如果节点太多,会导致崩溃。另一种方法是让Node类实施Node DisposeAndReturnNext()方法,该方法将导致Node处置其知道的所有资源,然后返回对下一个节点的引用。然后调用者可以使用类似:

while(nodeToDispose != null) 
    nodeToDispose = nodeToDispose.DisposeAndReturnNext(); 

这将是清楚的是,DisposeAndReturnNext方法预计不会处置的下一个节点(及其后代),即使它知道,他们需要处理。虽然Node可能定义一个包含上述循环的Dispose方法,但如果第一个清单项目的处理方法处理了公开的方法,并且通过类似上述的循环处理每个其他项目的处理似乎相当恶劣。最好在封闭的班级中有一个循环,它为每个人处理处置。