Класс C#, подклассы, IClonable, IDisposable
Я работаю в C# некоторые упражнения, и я не понимаю общую картину. Если бы они реализовались на Java, у меня не было бы проблем. Но я новичок в C#, поэтому я все перепутал и не знаю, как должна выглядеть структура. Я читаю некоторые объяснения, такие как: http://www.codeproject.com/Articles/15360/Implementing-IDisposable-and-the-Dispose-Pattern-P и http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx
У меня есть первый класс, где я делаю LinkedList, а его тип является узлом, поэтому: LinkedList связанный список = новый LinkedList, чем я делаю некоторые узлы в пути в связном списке с помощью некоторых методов, также здесь есть метод print, который печатает элементы из связанного списка.
Мой "объектный" класс - это Node, где у меня есть конструкторы, свойства и так далее геттеры и сеттеры. У меня также есть здесь метод virtula print, и я не знаю, что я должен добавить в этот метод, потому что этот класс узлов является просто абстрактным классом, и здесь я должен реализовать методы IDisposable:
public void Dispose() {}
protected virtual void Dispose(bool disposing) {}
Здесь я не понимаю, почему я должен использовать IDispose? Во всех примерах я видел, что он использовался для доступа к какому-либо файлу и работы с изображениями. В некоторых примерах я видел:
public interface IDisposable
{
void Dispose();
}
и я не знаю, должен ли я поместить это в какой-то новый класс, должен ли я поместить его в тот же класс или даже не реализовать его.
И затем я делаю подклассы NodeLong и Nodestring, которые используют узел суперкласса, куда я добавляю некоторые новые свойства, и сеттеры, и геттеры. Я также использовал метод печати. Я тоже не понимаю 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:Node.
В моих инструкциях сказано, что я должен использовать методы IClonable в обоих подклассах, я не знаю, как мне его использовать? Также используйте IDisposable в классе Node, как? Надеюсь мне понятно?
Итак, последний вопрос: как должен выглядеть мой класс, подкласс, 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
метод и распоряжение любым другим элементом, управляемым циклом, подобным приведенному выше, кажется довольно странным. Лучше иметь один цикл во вложенном классе, который обрабатывает удаление для всех.