2013-10-16 8 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# 클래스, 하위 클럭, IClonable, IDisposable

내가 LinkedList의을 일류를 가지고 ITST 유형 그래서, 노드 : LinkedList의 LinkedList의 = 나는 어떤에 의해 LinkedList의에서 puti 그것의 일부 노드를 만드는 것보다 새로운 LinkedList의 메소드는 linkedlist의 요소를 인쇄하는 method print도 있습니다.

내 "개체"클래스는 노드이며 여기에는 생성자, 속성 및 getter 및 setter가 있습니다. 내가 allso가 여기 virtula 방법 인쇄가 있고 나는이 노드 클래스는 단지 추상 클래스는 becuse,이 방법에 넣어 shoudl 모르는 여기 내가는 IDisposable 방법을 구현해야합니다 여기

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

내가 undrsetend하지 않습니다를 IDispose를 사용해야하는 이유는 무엇입니까? 모든 예제에서 나는 그것이 어떤 파일에 접근하고 그림으로 작업하는데 사용되었다는 것을 알았다. 몇 가지 예에서 나는 보았다

public interface IDisposable 
{ 
    void Dispose(); 
} 

나는 몇 가지 새로운 클래스에 넣고해야하는 경우 나는이 같은 클래스에 넣어 또는 그것을 구현하지 shuld, 모르겠어요.

그리고 하위 클래스 NodeLong과 Nodestring은 수퍼 클래스 노드를 사용하므로 몇 가지 새로운 속성과 setter 및 getter를 추가했습니다. 나는 또한 인쇄 방법을 사용했다. 나는 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를 한 경우 : 노드 : 나는 NodeLang을하지 못할 IClonable보다.

내 지침에 따라 두 하위 클래스 모두에서 IClonable 메서드를 사용해야한다고 나와 있는데 어떻게 사용해야합니까? 또한 Node 클래스에서 IDisposable을 사용합니다. 어떻게? 나는 이해할 수 있기를 바란다.

그래서 피날레 질문은 내 수업, 하위 클래스, IDisposable 및 ICloneable처럼 보일 것입니다. 그것은 복제 방법을 가지고 IDisposable를 구현하는 클래스에 대한 의미를 수있을 때

+3

강사가 실제 세계에서하지 않을 작업을 수행하도록 요청하고 있습니다. 해당 클래스가 관리되지 않는 리소스 (예 : 네트워크 연결 또는 데이터베이스 연결)를 보유하고있는 경우에만 클래스에 IDisposable을 구현해야합니다. –

+0

수업의 구조는 어떻게해야합니까? – wanttobeprofessional

+0

genercis를 사용하면 어떻게 생겼을까요?하지만 나는 일반적인 것이 무엇인지 이해합니다. – wanttobeprofessional

답변

0

중 하나 (이 코드는 복제 메소드를 호출 어떤 경우 개체가 Dispose가 새 복사본을 호출되는 것을 보장 할 책임이 될 것이다, 시간이있다 Dispose 그 자체를 호출하거나 책임을 다른 코드로 넘김). 컨테이너 내에있는 각 멤버에 대해 Dispose을 호출하는 Dispose 메서드를 사용하는 컨테이너 클래스를 사용하는 것이 합리적 일 수도 있지만 대부분의 경우 컨테이너 클래스의 용도는 이러한 처리를 중심으로 이루어지며 이유가 없습니다. 모든 종류의 복제를 지원합니다.

Node 클래스가 외부 세계에 노출되지 않는 한 IDisposable을 구현하는 데별로 목적이 없습니다.연결된 목록을 보유하는 클래스가 폐기 집계 자 (유용한 수명이 자신보다 짧을 객체를 받아들이고 자체 Dispose 메서드가 호출 될 때 객체를 정리하는 항목) 및 마지막 노드는 보유하지 않을 것입니다 정리가 필요하지만 다른 노드를 알 수도 있습니다. 다음 노드에 노드 호출 Dispose이 있으면 불필요한 재귀가 발생하여 너무 많은 노드가있는 경우 충돌이 발생합니다. 또 다른 방법은 Node 클래스가 Node DisposeAndReturnNext() 메서드를 구현하여 Node이 알고있는 모든 리소스를 처리 한 다음 다음 노드에 대한 참조를 반환하도록하는 것입니다. 그것은 그들이 처분이 필요하다고 알 것입니다하더라도, DisposeAndReturnNext 방법은 다음 노드 (와 그 자손)를 처리 할 것으로 예상되지 않을 것이 분명 할 것이다 여기

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

: 발신자는 다음과 같이 사용할 수 있습니다. Node은 위의 루프를 포함하는 Dispose 메서드를 정의 할 수 있지만 첫 번째 목록 항목의 처리는 public Dispose 메서드로 처리되고 위의 루프와 같이 다른 모든 항목의 처리는 다소 어려워 보입니다. 모든 사람들을위한 처리를 처리하는 둘러싼 클래스에서 하나의 루프를 만드는 것이 더 좋습니다.