4

今天我在 WPF 工作。

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

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

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

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

我觉得我试图做错了。

我该怎么做?

4

2 回答 2

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
}
于 2013-05-25T01:20:45.223 回答
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();
于 2013-05-25T01:51:33.283 回答