如何创建一个继承椭圆类的子类?

4

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

我可以轻松地继承Button或TextBox等类,但无法使其继承Ellipse类。我可以继承Shape类,而Ellipse是从中派生出来的,但无法直接继承Ellipse本身。

我的想法是为我创建的椭圆形添加一些属性,以便跟踪用户按这些椭圆形的顺序。我可以使用另一个类,或者使用Ellipse本身(并玩弄其已经存在的属性),但出于学习目的,我想知道为什么我不能(或如何)继承Ellipse类。

public partial class Ball : Ellipse
{
     ...
}
4个回答

7

抱歉,不能这样做。 Ellipse 类是 sealed 的。

你可以使用包装(wrap)的方式来使用它,但无法从它继承。

public class MyEllipse: Shape
{
   private Ellipse _Ellipse;

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

   // add custom methods/properties.
}

5

Ellipse 是一个被定义为 sealed 的类:

public sealed class Ellipse : Shape

sealed 的含义是:

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


4

由于椭圆形密封,而密封意味着“不能被继承”,因此您无法继承它。

或者,您可以使用修饰器模式,该模式可以帮助我们在不继承的情况下扩展类的行为。

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对象。

1
那是因为这个类被封装了,可以在这里看到。这意味着子类化实际上是不允许的。正如其他答案所述,它仍然可能被包装。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接