0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

プログラム初心者のためのC#入門 #10 継承

Last updated at Posted at 2019-05-10

#10 継承

今回はオブジェクト指向型プログラミングで重要な継承について説明します.まずは継承を使ったコードを見てみましょう.

InheritanceSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace InheritanceSample
{
    class Base
    {
        public void M()
        {
            Console.WriteLine("M Method called.");
        }
    }

    class Derived : Base { }

    class Program
    {
        static void Main(string[] args)
        {
            new Base().M();
            new Derived().M();
        }
    }
}
出力結果
M Method called.
M Method called.

クラス名の次に:継承したいクラス名を書くことで継承できる.
継承というのは属性(変数)や操作(関数)の受け継ぎができる機能で,上の例ではDerivedクラスでは定義されていないはずのMメソッドを使用することができています.これはDerivedクラスがBaseクラスを継承しているのでBaseクラスのメソッドを使うことができるということです.
ちなみに,継承されるクラス(この例ではBase)のことを,基底クラスや,スーパークラスなどと呼び,継承するクラス(この例ではDerived)のことを,派生クラスや,サブクラスなどと呼びます.
##抽象クラス

AbstractClassSample.cs
abstract class Base
{
    public void Method() { }
    public abstract void OverriddenMethod();
}

class Derived : Base
{
    public override void OverriddenMethod() { }
}

抽象クラスは自身のインスタンスを作れず,継承されることを前提とするクラスです.メソッドにabstract修飾子を付けることで,定義だけしてその実装を派生クラスに委譲することができます.
##インターフェース

InterfaceSample.cs
interface IBase
{
    void Method();
}
interface IBase2
{
    void Method2();
}

class Derived : IBase, IBase2
{
    public void Method() { }
    public void Method2() { }
}

インターフェースは,定義したプロパティ(メンバ変数とメソッドが融合したようなもの)やメソッドを,継承したクラスへ強制的に実装させるというものです.インターフェースは上の例の様に多重継承できます.
##使用例
実際に継承を使ってみましょう.

InheritanceSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace InheritanceSample
{
    abstract class Animal
    {
        public string sound;

        public Animal(string sound)
        {
            this.sound = sound;
        }

        public void MakeSounds()
        {
            Console.WriteLine(sound);
        }
    }
    class Dog : Animal
    {
        public Dog() : base("Bow wow") { }
    }
    class Cat : Animal
    {
        public Cat() : base("Meow") { }
    }
    class Bird : Animal
    {
        public Bird() : base("Chirp") { }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Animal[] animals = new Animal[] { new Dog(), new Cat(), new Bird() };

            foreach (Animal animal in animals)
            {
                animal.MakeSounds();
            }
        }
    }
}
出力結果
Bow wow
Meow
Chirp

Dogクラス,Catクラス,Birdクラスを全てAnimal型として扱っています.AnimalクラスはMakeSoundsメソッドを持っているので,animals内の全ての動物を鳴かせることができています.
派生クラスのコンストラクタが呼び出されると,自動的に基底クラスのコンストラクタも呼び出されますが,:Base()と書くと,基底クラスのコンストラクタを明示的に呼び出すことができます.

次回はポリモーフィズムについて説明します.

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?