有继承密封类的替代方法吗?

时间:2015-04-22 20:20:02

标签: c# wpf inheritance sealed

我之所以这样问是因为我想创建一个具有FileInfo类所有功能的类(派生自FileInfo),并允许我添加自己的属性。

我认为一个例子会更多地合作。 我想要的是什么:

BindingList<FileInformation> files = new BindingList<FileInformation>();
public void GatherFileInfo(string path)
{
    files.Add(new FileInformation(path));
    listboxFiles.DataContext = files;
}

class FileInformation : FileInfo
{
    public bool selected = false;
}

我害怕我必须做的事情:

BindingList<FileInformation> files = new BindingList<FileInformation>();
public void GatherFileInfo(string path)
{
    files.Add(new FileInformation(path));
    listboxFiles.DataContext = files;
}

class FileInformation : FileInfo
{
    string path = "<whatever>"
    FileInfo fileInfo = new FileInfo(path);
    public bool selected = false;

    public string Name
    {
        get { return fileInfo.Name }
    }
    //Manually inherit everything I need???
}

这样做的好处是,在WPF中,您可以简单地绑定到FileInformation类的所有属性,包括继承的FileInfo类的属性。

我从来没有调查过这个问题而且我没有引导到我应该开始寻找的地方,所以一个例子或如何做到这一点的主角将会有所帮助。

3 个答案:

答案 0 :(得分:2)

真的没有办法从.Net中的密封类继承。您可以编写扩展方法,但这不允许您添加新属性或字段。您可以做的唯一其他事情是模拟继承,但是创建自己的类,其中包含您要继承的类类型的字段,然后手动公开&#34; base&#34;的每个属性和方法。通过为每个人编写一个包装器方法。如果班级很小,那也不错,但如果它是一个大班,那就会变得很痛苦。

我编写了代码生成器程序,使用反射自动为我完成此操作。然后我取出它的输出并扩展它。但它不是真正的继承。我个人不喜欢密封类的概念,因为它阻止了扩展这些类。但我想他们出于性能原因这样做了。

答案 1 :(得分:2)

要从密封类继承尝试使用装饰器设计模式, 基本思想是创建OldClass的私有实例,并手动实现所有其方法,如:

public class NewClass
{
    private OldClass oldClass = new OldClass();

    public override string ToString() 
    {
        return oldClass.ToString();
    }
    //void example
    public void Method1()
    {
        oldClass.Method1();
    }
    //primitive type example
    public int Method2()
    {
        return oldClass.Method2();
    } 
    //chaining example, please note you must return "this" and (do not return the oldClass instance).
    public NewClass Method3()
    {
        oldClass.Method3();
        return this;
    }
}

public class Demo
{
    static void Main(string[] args)
    {
       var newClass = new NewClass();
       newClass.Method3();
       WriteLine(newClass);
    }
}

答案 2 :(得分:0)

FileInfo继承自MarshalByRefObject时,您可以创建一个模仿FileInfo的自定义代理,并处理您自己实现中的所有调用。但是,您无法强制转换,更重要的是,您无法使用自定义属性扩展此类。无论如何,如果其他人想要这个,SharpUtils有一些工具可以帮助它。