C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#で多重継承を実現する方法:インターフェースを使った実装ガイド

C#における多重継承の基本

C#では、クラスに対する多重継承(Multiple Inheritance)はサポートされていません。これは、複数の基底クラスを持つことで発生しうる曖昧性(いわゆる「ダイヤモンド継承問題」)を避けるための言語設計上の判断です。

しかし、インターフェース(Interface)を利用することで、多重継承と同等の機能を実現できます。1つのクラスは複数のインターフェースを実装できるため、異なる機能を柔軟に組み合わせることが可能です。

インターフェース「PaintCost」の定義

まず、塗料コストを計算するためのインターフェース PaintCost を定義します。このインターフェースは、面積を受け取ってコストを返すメソッド getCost を宣言しています。

public interface PaintCost {
    int getCost(int area);
}

インターフェースにはメソッドの宣言のみを記述し、実際の処理内容は実装側のクラスで定義します。これにより、契約(コントラクト)としての役割を果たします。

基底クラスと派生クラスの構成

ここでは Shape を基底クラス、Rectangle を派生クラスとして扱います。Rectangle クラスは Shape を継承すると同時に、PaintCost インターフェースも実装しています。

class Rectangle : Shape, PaintCost {
    public int getArea() {
        return (width * height);
    }
    public int getCost(int area) {
        return area * 80;
    }
}

このように、継承するクラスと実装するインターフェースをカンマで区切って並記することで、事実上の多重継承が実現できます。

完全なサンプルコード

以下は、C#でインターフェースを使って多重継承を実装する完全なサンプルコードです。

using System;
namespace MyInheritance {
    class Shape {
        public void setWidth(int w) {
            width = w;
        }
        public void setHeight(int h) {
            height = h;
        }
        protected int width;
        protected int height;
    }
    public interface PaintCost {
        int getCost(int area);
    }
    class Rectangle : Shape, PaintCost {
        public int getArea() {
            return (width * height);
        }

        public int getCost(int area) {
            return area * 80;
        }
    }
    class RectangleDemo {
        static void Main(string[] args) {
            Rectangle Rect = new Rectangle();
            int area;
            Rect.setWidth(8);
            Rect.setHeight(10);
            area = Rect.getArea();
            // オブジェクトの面積を出力
            Console.WriteLine("Total area: {0}", Rect.getArea());
            Console.WriteLine("Total paint cost: ${0}", Rect.getCost(area));
            Console.ReadKey();
        }
    }
}

実行結果

このプログラムを実行すると、以下のような出力が得られます。

Total area: 80
Total paint cost: $6400

幅8・高さ10の長方形から面積80が計算され、それに単価80を掛けた塗料コスト6400ドルが出力されます。

まとめ

  • C#はクラスの多重継承をサポートしていない
  • インターフェースを複数実装することで、多重継承と同等の設計が可能
  • インターフェースは実装の詳細を持たないため、継承の曖昧性を回避できる
  • 共通機能の再利用や疎結合な設計に有効

インターフェースを活用することで、保守性が高く拡張しやすいオブジェクト指向設計を実現できます。ぜひ実際のコードでも活用してみてください。

  1. C++で円と長方形の重なりを判定するアルゴリズム

    問題の概要円を (radius, xc, yc) という形式で表します。ここで (xc, yc) は円の中心座標です。同様に、軸に平行な長方形(軸平行境界ボックス)を (x1, y1, x2, y2) という形式で表し、(x1, y1) が左下隅の座標、(x2, y2) が右上隅の座標とします。このとき、円と長方形が互いに重なっているかどうかを判定する必要があります。たとえば、次のような入力が与えられた場合を考えてみましょう。この場合、出力は true(重なりあり)となります。解決のアプローチこの問題を解く鍵は、「長方形の中で円の中心に最も近い点」を見つけることです。その点と円の中心との距離が

  2. 【C++入門】多重継承の基本と実装方法をわかりやすく解説

    多重継承(Multiple Inheritance)とは多重継承とは、ひとつのクラスが複数の基底クラス(親クラス)から派生する仕組みのことです。多重継承を利用することで、派生クラスは複数の基底クラスが持つ機能やデータメンバをまとめて引き継ぐことができます。これはC++に代表されるオブジェクト指向プログラミング言語における重要な機能のひとつです。多重継承の構造を表した図が以下になります。C++で多重継承を実装するサンプルプログラムここでは、C++で多重継承を実装したサンプルプログラムを紹介します。クラスCが、クラスAとクラスBの2つのクラスを同時に継承する例です。サンプルコード#include