简体   繁体   中英

Initializing Inherited Class Through Derived Constructor's Arguments (C#)

Hell, the title probably wasn't the best, but I'm a fairly new programmer and haven't had much experience with inherited classes. I'm trying to initialize a class (my own Stream derived from the normal FileStream class) and have the option of initializing the base from the derived's arguments. For example...

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

Obviously I can't just do that, but it best shows what I'd like to do. The main reason why I'm doing this is because of contradicting streams -- and what I mean by that is that within this class, another class automatically opens the file (and does some reading and whatnot) and I get thrown an exception that the file is inaccessible. Maybe I'm doing this wrong, but thanks for everyone's time!

You can't do that, no. But for Stream specifically, you can derive from Stream , store the FileStream in a private field and pass all the method calls to it:

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(...); }
}

If you move the text cursor to the word Stream after the Example : , press Alt+Shift+F10 and choose “Implement abstract class Stream”, it will generate all the method declarations for you, but you will still have to change all the throw new NotImplementedException() into the proper calls to _underlying .

As you might expected, you're making a mistake in the syntax, you can help with this example.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM