2015-11-15 5 views
0

Я пишу приложение, которое принимает Wireshark Файл (Pcap, Snopp, Pcapng ...) открыть этот файл и прочитать все Packets.Почему мне нужно определить Dispose в моем базовом классе, хотя его абстрактный?

Так я создаю это abstract class, что каждый класс, который наследует от этого класса нужно будет реализовать очевидные методы для того, чтобы иметь эту возможность открывать определенный формат:

public abstract class WiresharkFile 
{ 
    protected string _fileName; 
    protected int _packets; 
    protected string _duration; 
    public abstract void ReadFileDetails(); 
} 

И все классы суб:

public class Libpcap : WiresharkFile, IDisposable, IEnumerable<WiresharkFilePacket> 
{ 
    .... 
} 

Теперь, когда цикл по конкретному формату и считывать пакеты:

using (wiresharkFile = new Libpcap(file)) 
{ 

} 

у меня есть эта ошибка компиляции:

type used in a using statement must be implicitly convertible to 'System.IDisposable' 

Так что мой вопрос, почему я должен реализовать IDisposable в моем базовом классе, если я не могу создать объект из этого типа, и то, что я должен написать в этом Dispose на моем базовом классе?

ответ

2

using -statement пытается вызвать IDisposable.Dispose на экземпляр, который вы ему передали. Этот экземпляр имеет тип WiresharkFile. При переводе код выглядит как-то так:

WiresharkFile wiresharkFile = new Libpcap(file); 

try 
{ 
    // ... 
} 
finally 
{ 
    wiresharkFile.Dispose(); 
} 

Однако WiresharkFile не поддерживает IDisposable inteface и для этого Dispose() не определен. Либо вы просто добавить IDisposable в свой абстрактный базовый класс, как это:

public abstract class WiresharkFile : IDisposable 
{ 
} 

где нет необходимости не осуществлятьDispose (вы должны реализовать ее в Libpcap), либо создать экземпляр Libpcap и передать его к using -Настоящее вид:

using(Libpcap wiresharkFile = new Libpcap(file)) 
{ 
    // ... 
}