Инициализация унаследованного класса с помощью аргументов производного конструктора (C #) - PullRequest
1 голос
/ 21 января 2011

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

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

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

Ответы [ 2 ]

4 голосов
/ 21 января 2011

Ты не можешь этого сделать, нет.Но для 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 и выберите «Реализация абстрактного класса Stream», он сгенерирует все объявления методов для вас, но вам все равно придется изменить все throw new NotImplementedException() на соответствующиезвонки на _underlying.

0 голосов
/ 21 января 2011

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

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)
    { }
}
...