C#类,子类,ICloneable,IDisposable

时间:2013-10-16 23:24:27

标签: c# idisposable icloneable

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

我有第一个类,我在哪里创建LinkedList,它的类型是节点,所以:      LinkedList linkedlist = new LinkedList 我通过一些方法在链表中创建了一些节点,这里也是方法打印,它打印来自链表的元素。

我的“对象”类是Node,其中我有构造函数,属性以及getter和setter。我还有这里的virtula方法打印,我不知道我在这个方法中放了什么shoudl,因为这个节点类只是抽象类,在这里我必须实现IDisposable方法:

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

在这里,我不解释为什么要使用IDispose?在所有示例中,我看到它已被用于访问某些文件和处理图片。在一些例子中,我看到:

 public interface IDisposable
 {
   void Dispose();
 }

我不知道是否必须把它放在一个新的类中,我把它放在同一个类中,甚至不实现它。

而且我创建了使用超类节点的子类NodeLong和Nodestring,我放了一些新的属性和setter和getter。我也用过print方法。 我也不懂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??
        }
     }

My 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:Node。

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

所以压轴问题是它应该如何看起来像我的类,子类,IDisposable和ICloneable?

1 个答案:

答案 0 :(得分:0)

有些时候,实现IDisposable的类有一个克隆方法是有意义的,在这种情况下,无论代码调用克隆方法,对象都有责任确保Dispose将调用新副本(通过调用Dispose本身,或将责任移交给其他代码)。在某些情况下,有一个带有Dispose方法的容器类在其中存储的每个成员上调用Dispose是有意义的,尽管在大多数情况下,容器类的目的是围绕这种处置并且没有理由支持任何类型的克隆。

除非Node课程会暴露给外界,否则我没有看到实施IDisposable的目的。即使持有链表的类是一个处理聚合器(接受其有效生命周期将短于其自身的对象,然后在调用自己的Dispose方法时清除它们的东西)和每个节点但最后一个不仅会保留需要清理的东西,还会知道另一个节点。在下一个节点上调用节点Dispose将导致不必要的递归,如果节点太多则导致崩溃。另一种方法是让Node类实现Node DisposeAndReturnNext()方法,这将导致Node处理它所知道的所有资源,然后返回对下一个节点的引用。然后呼叫者可以使用以下内容:

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

这里很明显,DisposeAndReturnNext方法不会出现处理下一个节点(及其后代),即使它知道它们需要处理。虽然Node可以定义一个包含上述循环的Dispose方法,但是第一个列表项的处理可以处理公共Dispose方法并且每个方法都有其他项目的处理由上面的循环处理似乎相当icky。最好有一个循环,在封闭的类中,处理每个人的处理。