やりたいことと違った。

ブツ

コード

interface IAccelerator {
    void Accelerator(int gear = -1);
}
class Car : IAccelerator {
    private int gear;
    protected int Gear {
        get { return this.gear; }
        set { if (0<=value && value<=6) { this.gear = value; } }
    }
    public void Accelerator(int gear = -1) {
        Console.WriteLine("{0}.{1}() {2}", GetType().Name, System.Reflection.MethodBase.GetCurrentMethod().Name, this.Gear);
    }
}
class ATCar : Car {
    public new void Accelerator(int gear = -1) {
        if (6 == this.Gear) { this.Gear = 0; }
        this.Gear++;
        base.Accelerator();
    }
}
class MTCar : Car {
    public new void Accelerator(int gear = -1) {
        if (1 == Math.Abs(this.Gear - gear)) {
            Console.WriteLine("{0}.{1}({2}) {3}", 
                GetType().Name, 
                System.Reflection.MethodBase.GetCurrentMethod().Name, 
                gear, this.Gear);
            this.Gear = gear;
        }
        else {
            Console.WriteLine("{0}.{1}({2}) {3} {4}", 
                GetType().Name, 
                System.Reflection.MethodBase.GetCurrentMethod().Name, 
                gear, this.Gear, "エンスト!");
            this.Gear = 0;
        }
    }
}
Car car = new Car();
ATCar at = new ATCar();
MTCar mt = new MTCar();

car.Accelerator();
car.Accelerator();

Console.WriteLine("---------- AT ----------");

at.Accelerator();
at.Accelerator();
at.Accelerator();
at.Accelerator();
at.Accelerator();
at.Accelerator();
at.Accelerator();

Console.WriteLine("---------- MT ----------");
mt.Accelerator();
mt.Accelerator();
Console.WriteLine("---------- MT 引数あり ----------");
mt.Accelerator(1);
mt.Accelerator(2);
mt.Accelerator(3);
mt.Accelerator(2);
mt.Accelerator(4);
mt.Accelerator(3);
mt.Accelerator(1);

Console.WriteLine("========== Car ==========");

Car at1 = new ATCar();
Car mt1 = new MTCar();
at1.Accelerator(); // Carのものが呼び出される
at1.Accelerator(); // Carのものが呼び出される
mt1.Accelerator(1); // Carのものが呼び出される
mt1.Accelerator(2); // Carのものが呼び出される

Console.WriteLine("========== IAccelerator ==========");

IAccelerator at2 = new ATCar();
IAccelerator mt2 = new MTCar();
at2.Accelerator(); // Carのものが呼び出される
at2.Accelerator(); // Carのものが呼び出される
mt2.Accelerator(1); // Carのものが呼び出される
mt2.Accelerator(2); // Carのものが呼び出される

Console.WriteLine("========== var ==========");

var at3 = new ATCar();
var mt3 = new MTCar();
at3.Accelerator();
at3.Accelerator();
mt3.Accelerator(1); // error CS1501: 引数 1 を指定するメソッド 'Accelerator' のオーバーロードはありません
mt3.Accelerator(2); // error CS1501: 引数 1 を指定するメソッド 'Accelerator' のオーバーロードはありません

Console.WriteLine("========== Factory ==========");

var factory = new CarFactory();
var someCar = factory.create();
someCar.Accelerator();
someCar.Accelerator(1);
someCar.Accelerator(3);
someCar = factory.create(true);
someCar.Accelerator();
someCar.Accelerator(1);
someCar.Accelerator(3);

結果

Car.Accelerator() 0
Car.Accelerator() 0
---------- AT ----------
ATCar.Accelerator() 1
ATCar.Accelerator() 2
ATCar.Accelerator() 3
ATCar.Accelerator() 4
ATCar.Accelerator() 5
ATCar.Accelerator() 6
ATCar.Accelerator() 1
---------- MT ----------
MTCar.Accelerator(-1) 0
MTCar.Accelerator(-1) 0
---------- MT 引数あり ----------
MTCar.Accelerator(1) 0
MTCar.Accelerator(2) 1
MTCar.Accelerator(3) 2
MTCar.Accelerator(2) 3
MTCar.Accelerator(4) 2 エンスト!
MTCar.Accelerator(3) 0 エンスト!
MTCar.Accelerator(1) 0
========== Car ==========
ATCar.Accelerator() 0
ATCar.Accelerator() 0
MTCar.Accelerator() 0
MTCar.Accelerator() 0
========== IAccelerator ==========
ATCar.Accelerator() 0
ATCar.Accelerator() 0
MTCar.Accelerator() 0
MTCar.Accelerator() 0
========== var ==========
ATCar.Accelerator() 1
ATCar.Accelerator() 2
MTCar.Accelerator(1) 0
MTCar.Accelerator(2) 1
========== Factory ==========
ATCar.Accelerator() 0
ATCar.Accelerator() 0
ATCar.Accelerator() 0
MTCar.Accelerator() 0
MTCar.Accelerator() 0
MTCar.Accelerator() 0

たいして変化ない。IAccelerator型ではやはりCarの実装が呼ばれているっぽい。

ググった所、私のやりたいことは多態性(ポリモーフィズム)と呼ぶらしい。次はそのへんでどうにかやってみよう。

前回