如何从密封类中解决不可能的继承问题?

时间:2013-05-25 01:08:05

标签: c# oop inheritance sealed

今天我在WPF工作。

我尝试从System.Windows.Shapes.Line类继承,如下所示:

class MyLine : System.Windows.Shapes.Line
{
    public Ln()
    {
        this.Stroke = Brushes.Black;
    }
}

我刚才意识到,Line类是密封的。

我的目标是创建一个类,它将像Line类一样工作(将它放在Canvas上),但我不希望每次都添加刷子来弄乱我的代码,让我们说总是想要2px宽的黑色画笔/笔画。

我觉得我试图做错了。

我该怎么做?

2 个答案:

答案 0 :(得分:4)

您可以创建工厂类:

public class LineFactory
{
    public Line Create(<parameters here>)
    {
        //create and return a Line object
    }
}

工厂也可能是static,但这可能会阻碍可测试性。

请注意,此解决方案不允许您扩展 Line类作为继承。要做到这一点,您需要返回一个MyLine类,该类将嵌入Line个对象以及您希望MyLine拥有的其他属性。

public class MyLine
{
    private Line _theBoringOriginal; // composition: "has-a" (vs inheritance "is-a")
    public MyLine(Line line)
    {
        _theBoringOriginal = line;
    }

    public foo SomeProperty { get; set; }
}

如果只是想要扩展Line类的方法,则不需要新类,只需在静态类中编写扩展方法:

public static foo DoSomethingCool(this Line line, <parameters here>)
{
    // whatever
}

答案 1 :(得分:3)

为什么不简单地创建一个扩展类来做你想做的事情?扩展类是专门创建的,允许您使用新方法扩展密封类,而不必实际继承。

public static class LineExtensions {
    // returns the Line so you can use it fluently
    public static Line MakeLineBlack(this Line line) {
        line.Stroke = Brushes.Black;
        return line;
    }
}

然后你可以这样做:

var line = new Line().MakeLineBlack();