hakeの日記

Windows環境でプログラミングの勉強をしています。

C# - クラス - 抽象クラス

継承することを前提し、メソッドやプロパティの外観だけを記述するクラス。
クラス宣言に abstract キーワードを付加する。

    abstract class クラス名

また、定義するメソッドやプロパティにも absrtact キーワードを付加する。派生クラス側では override キーワードを付加して処理の具体的な内容を記述する。
下の例では抽象クラスとして Shape を定義している。この抽象クラスは、変数として一個の座標情報をコンストラクタから与えて保持する。また抽象プロパティとして Length(全周長さ)、抽象メソッドとして GetArea(面積を取得) を持つ。
Shapeを継承したクラスとして、Circle(円)とRectangle(長方形)クラスを定義している。Circleクラスには半径情報を、Rectangleクラスには対角の座標情報をコンストラクタの引数に追加していて、これらの情報を元に、LengthプロパティとGetAreaメソッドの実際の処理を記述している。

using System;

//抽象クラス

//形クラス
abstract class Shape
{
    protected double x1;
    protected double y1;

    public Shape(double x1, double y1)
    {
        this.x1 = x1;
        this.y1 = y1;
    }

    //抽象プロパティ
    public abstract double Length{get;}
    //抽象メソッド
    public abstract double GetArea();

}

//丸クラス
class Circle : Shape
{
    private double r;

    public Circle(double x1, double y1, double r) : base(x1, y1)
    {
        this.r = r;
    }

    //抽象プロパティをoverride
    public override double Length
    {
        get
        {
            return 2*3.14*r;
        }
    }

    //抽象メソッドをoverride
    public override double GetArea()
    {
        return 3.14*r*r;
    }

    //メソッド
    public void GetCenter()
    {
        Console.WriteLine("  x : {0:F1}, y : {1:F1}", this.x1, this.y1);
    }
}


//長方形クラス
class Rectangle: Shape
{
    private double x2;
    private double y2;

    public Rectangle(double x1, double y1, double x2, double y2) : base(x1, y1)
    {
        this.x2 = x2;
        this.y2 = y2;
    }

    //抽象プロパティをoverride
    public override double Length
    {
        get
        {
            return ((x2 - x1) + (y2 - y1)) * 2;
        }
    }

    //抽象メソッドをoverride
    public override double GetArea()
    {
        return (x2 - x1) * (y2 - y1);
    }
}



class MyMain
{
    static void Main(string[] args)
    {
        Circle c = new Circle(1.0, 1.0, 10.0);
        Console.WriteLine("Circleクラス");
        Console.WriteLine("  Length : {0}", c.Length);
        Console.WriteLine("    Area : {0}", c.GetArea());
        c.GetCenter();
        Rectangle r = new Rectangle(1.0, 1.0, 3.0, 4.0);
        Console.WriteLine("Rectangleクラス");
        Console.WriteLine("  Length : {0}", r.Length);
        Console.WriteLine("    Area : {0}", r.GetArea());
    }
}

 

実行結果

Circleクラス
  Length : 62.8
    Area : 314
  x : 1.0, y : 1.0
Rectangleクラス
  Length : 10
    Area : 6