我是C#语言的新手,我在创建一个继承某个类属性的子类时遇到了一些麻烦。我正在使用Visual Studio 2012来创建Windows Phone 8应用程序。
我继承像Button或TextBox这样的类没有问题,但是我不能让它继承Ellipse类。我可以继承Shape类,从中派生出Ellipse,但不能继承Ellipse本身。
我的想法是为我创建的省略号添加一些属性,因此我可以跟踪用户按这些省略号的顺序。我可以使用另一个类,或者使用Ellipse本身(并使用它已经存在的属性),但出于学习目的,我想知道为什么我不能(或我怎么能)继承Ellipse类。
public partial class Ball : Ellipse
{
...
}
答案 0 :(得分:6)
你做不到。 Ellipse
是sealed
。
你可以包装它,但你不能继承。
public class MyEllipse: Shape
{
private Ellipse _Ellipse;
// pass through overridden Shape methods/properties to the underlying Ellipse
// add custom methods/properties.
}
答案 1 :(得分:5)
答案 2 :(得分:4)
由于Ellipse
为sealed
而sealed
表示“无法继承”,因此您无法继承它。
Alternatevily你可以使用Decorator Pattern来帮助我们扩展没有继承的类的行为。
public abstract class ShapeDecorator : Shape {
protected Shape Shape {get; private set;}
protected(Shape shape) {
this.Shape = shape;
}
}
public abstract class EllipseDecorator : ShapeDecorator {
protected(Ellipse ellipse) : base(shape) {
}
public Ellipse Ellipse { get { (Ellipse)base.Shape; } }
// Here, if you wish, you can override some methods using Ellipse features inside
// So that your Shape acts as Ellipse
}
public class Ball : EllipseDecorator {
public Ball() : base(new Ellipse()) {
// you can initialize base.Ellipse here
}
// Now you can add your Ball specific methods here
// You can still override some methods here
// So that your ellipse acts as Ball
}
现在,如果任何方法需要Ellipse
类型的参数,您可以传递ball.Ellipse
。如果它接受Shape
类型的参数,则可以直接传递Ball
对象。
答案 3 :(得分:1)