2013-10-16 37 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方法,但如果第一個清單項目的處理方法處理了公開的方法,並且通過類似上述的循環處理每個其他項目的處理似乎相當惡劣。最好在封閉的班級中有一個循環,它爲每個人處理處置。