0

我正在使用 C# 进行一些练习,但我不了解大局。如果这些应该在 Java 中实现,我不会有问题。但是我是 C# 的新手,所以我把事情搞混了,我不知道结构应该是什么样子。我读了一些解释,例如: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 比我在 puti 中通过一些方法在链表中创建一些节点,这里还有方法 print,它从链表中打印元素。

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

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

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

 public interface IDisposable
 {
   void Dispose();
 }

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

然后我创建了使用超类节点的子类 NodeLong 和 Nodestring,我放置了一些新的属性以及 setter 和 getter。我也使用了打印方法。我也不懂泛型。

线性集合类:

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

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

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

4

1 回答 1

1

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

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

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

这里很明显,该DisposeAndReturnNext方法不会被期望处理下一个节点(及其后代),即使它知道它们需要处理。虽然可以Node定义一个Dispose包含上述循环的方法,但让第一个列表项的处置处理一个公共Dispose方法,而让其他所有项目的处置由上述循环处理似乎相当棘手。最好有一个循环,在封闭的类中,为每个人处理处置。

于 2014-10-29T15:49:56.747 回答