2011-01-21 4 views
1

Ад, название, вероятно, было не самым лучшим, но я довольно новый программист и не имел большого опыта работы с унаследованными классами. Я пытаюсь инициализировать класс (мой собственный поток, полученный из обычного класса FileStream) и иметь возможность инициализировать базу из аргументов производного. Например ...Инициализация унаследованного класса с помощью аргументов конструктора (C#)

public class Example : FileStream 
{ 
public Example(FileStream FS) : base = FS 
} 

Очевидно, что я не могу просто сделать это, но это лучше всего показывает, что я бы как делать. Основная причина, по которой я делаю это, - это из-за противоречивых потоков - и я имею в виду, что в этом классе другой класс автоматически открывает файл (и делает некоторое чтение и еще много чего), и я получаю исключение, которое файл недоступен. Возможно, я делаю это неправильно, но спасибо за все время!

+0

Что вы пытаетесь сделать, расширив FileStream. Я думаю, что его достаточно для обработки операций с файлами. Пожалуйста, объясните, что вы хотите сделать, сделав это. И какая проблема вы сталкиваетесь –

+0

Просто для удовольствия, синтаксис C++: общедоступный класс ref Пример: public FileStream { Публикация: Пример (FileStream^stream): base (stream) {/ * что-то происходит здесь, если есть * /} } –

+0

@Artur: У меня нет C++, но это, вероятно, тоже не будет компилироваться. – Timwi

ответ

4

Вы не можете этого сделать, нет. Но для Stream конкретно, вы можете извлечь из Stream, хранить FileStream в частной области и передать все вызовы методов к нему:

public class Example : Stream 
{ 
    private Stream _underlying; 

    public Example(Stream underlying) { _underlying = underlying; } 

    // Do the following for all the methods in Stream 
    public override int Read(...) { return _underlying.Read(...); } 
} 

Если переместить курсор на слово Stream после Example :, нажмите Alt + Shift + F10 и выберите «Реализовать абстрактный поток класса», он будет генерировать все объявления методов для вас, но вам все равно придется изменить все throw new NotImplementedException() на соответствующие вызовы на _underlying.

+0

Спасибо! Я попробую это как можно скорее. – Lander

+0

+1 да, это более общий подход, мне это нравится –

+0

Вы сказали что-то здесь, так что ... Физически невозможно открыть поток файлов внутри файлового потока, в отличие от других ОС, в окнах нет suppot иерархической FS, вы можете попробовать файлы с отображением памяти, собственные кодеки (например, WMA или MP3) внутри FS или использовать любую из известных технологий виртуализации. –

-1

Как вы и ожидали, вы ошибаетесь в синтаксисе, вы можете использовать с этим примером.

public class SomeClassA 
{ 
    public int foo1; 
    public string foo2; 
    public SomeClassA(int foo1, string foo2) 
    { 
     this.foo1 = foo1; 
     this.foo2 = foo2; 
    } 
} 
public class SomeClassB : SomeClassA 
{ 
    public SomeClassB(int arg1, string arg2) 
     : base(arg1, arg2) 
    { } 
} 
+0

Это не помогает в его случае. Он не хочет инициализировать аргументы, но из существующего экземпляра. – Timwi

+0

Спасибо, но, пожалуйста, просмотрите, что я написал в Shekhar_Pro выше. edit: да, что сказал Тимви. – Lander

Смежные вопросы