如何创建继承Ellipse类的子类

时间:2014-02-13 15:26:56

标签: c# wpf inheritance windows-phone-8

我是C#语言的新手,我在创建一个继承某个类属性的子类时遇到了一些麻烦。我正在使用Visual Studio 2012来创建Windows Phone 8应用程序。

我继承像Button或TextBox这样的类没有问题,但是我不能让它继承Ellipse类。我可以继承Shape类,从中派生出Ellipse,但不能继承Ellipse本身。

我的想法是为我创建的省略号添加一些属性,因此我可以跟踪用户按这些省略号的顺序。我可以使用另一个类,或者使用Ellipse本身(并使用它已经存在的属性),但出于学习目的,我想知道为什么我不能(或我怎么能)继承Ellipse类。

public partial class Ball : Ellipse
{
     ...
}

4 个答案:

答案 0 :(得分:6)

你做不到。 Ellipsesealed

你可以包装它,但你不能继承

public class MyEllipse: Shape
{
   private Ellipse _Ellipse;

   // pass through overridden Shape methods/properties to the underlying Ellipse

   // add custom methods/properties.
}

答案 1 :(得分:5)

Ellipse定义为sealed

public sealed class Ellipse : Shape

sealed表示

  

当应用于类时,sealed修饰符会阻止其他类继承它。

答案 2 :(得分:4)

由于Ellipsesealedsealed表示“无法继承”,因此您无法继承它。

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)

那是因为可以看到sealed类是here。这意味着实际上不允许子类化。正如其他答案所述,它可能仍然被包裹起来。