如何解决来自密封类的不可能继承
本文关键字:密封类 不可能 继承 何解决 解决 | 更新日期: 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();