【问题标题】:C# class, subclases, IClonable, IDisposableC# 类、子类、IClonable、IDisposable
【发布时间】:2013-10-16 23:24:26
【问题描述】:

我正在使用 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 = 新的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?

【问题讨论】:

  • 您的教练要求您做一些您在现实世界中不会做的事情。如果该类持有非托管资源(如网络连接或数据库连接),则应仅在该类上实现 IDisposable。
  • 类的结构怎么弄?
  • 如果我使用泛型会是什么样子,但我不太了解泛型是什么...

标签: c# idisposable icloneable


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多