如何解决来自密封类的不可能继承

本文关键字:密封类 不可能 继承 何解决 解决 | 更新日期: 2023-09-27 18:15:21

今天我在WPF工作。

我试图从System.Windows.Shapes.Line类继承,像这样:

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

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

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

我觉得我想做错了。

我该怎么做呢?

如何解决来自密封类的不可能继承

您可以创建一个工厂类:

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
}

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

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