- PR -

インタフェースと抽象クラスの混合は問題ない?

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-10 09:18
引用:

抽象クラス(abstract Class)はなるべく使わず、interface を多用せよ。abstract Classは、一部実装があり、一部抽象メソッドであるような場合にのみ使う。


初めに、インパクトがあるので 「何でもかんでも」 なように見えないこともないですね。
私は、Interface として完全に切り出せるかどうか...
といっても、単発はありえないので、殆ど Interface になります。

個人的にも、Interface の方が、カッコよくて好きだったり。(定義場所さえ的確ならば)

引用:

理由:interface は幾つでも継承できるが、Classは1つだけ。1つから継承してしまうと、もう継承できずもったいない。


インターフェイスは 「継承」 ではなく、「実装」 ではないかと思ってみたり...w

Interface と 抽象クラスの混在に問題があるかどうかは、設計次第でしょう。(どちらとも言えない)
逆に言えば、無計画に後付されたものは、問題を含んでいることが多いでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-06-10 09:53
僕の場合、作る過程で重複する処理をクラスに切り出していく過程で、いくつか継承させてベースとなるクラスを抽象クラスにしちゃうという流れはありますw
(人はこれを行き当たりばったりな設計と呼ぶ・・・)

引用:

じゃんぬねっとさんの書き込み (2006-06-10 09:18) より:

個人的にも、Interface の方が、カッコよくて好きだったり。(定義場所さえ的確ならば)


使う理由にカッコ良いからというのは、深く同感です。
同じ理由で、僕は一時マイブームだった日本語プログラミングを最近やらなくなりました。どうして日本語だと○○に見えるんだろう・・・

引用:

じゃんぬねっとさんの書き込み (2006-06-10 09:18) より:

インターフェイスは 「継承」 ではなく、「実装」 ではないかと思ってみたり...w


僕も密かに思ったのですが、抽象クラスとの比較なので、あえて継承で揃えたのかな?、と思いました。

コード:
interface I継承しれ{
    void 継承();
}

class ちゅーしょーくらす : I継承しれ
{
    public void 継承() { }
}

class いんたぁふぇいす : I継承しれ
{
    public void 継承() { }
}

lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2006-06-10 10:29
引用:
囚人さんの書き込み (2006-06-09 23:43) より:
そもそも大事な事が抜けていましたね。
引用:

出来る限りインタフェースを使った方が良い

出来る限り「何より」インタフェースを使った方が良いのか。
これが食い違っていたら話が噛み合わないでしょう。


 そうか、確かにそうですね。でもカギ括弧は
引用:
出来る限り


にもつけたいです。
lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2006-06-10 10:29
 とりあえず用件だけ済ませよう。
引用:
囚人さんの書き込み (2006-06-09 23:43) より:
どちらがより抽象でしょうか?
(中略)
抽象度は同一だと思います。


 冗長なのでコードの引用はしません。

引用:
IInter や Abst を実装または派生するクラス

1. 「「継承」は結合度が最も高い概念。」なのでAbstの抽象度はIInterと同一か、低い。
2. 継承ツリー上Abstより上にIInterがあればAbst.Hoge()をジャンプできる。
なのでIInterの抽象度はAbstと同一か、高い。

 これ↑が、「できる限り」の意義。


引用:
IInter や Abst のクライアント

1. 「その」Func()を使う、に対してIInteとAbstの抽象度は抽象度は同一。
2. 「どの」Func()を使う、に対してIInterの抽象度はAbstと同一か、高い。


 以上から
引用:
より抽象

なのはIInterだと考えられます。

編集:
1. 「その」Func()を使う、に対して抽象度は同一。

1. 「その」Func()を使う、に対してIInteとAbstの抽象度は抽象度は同一。

2. 「どの」Func()を使う、に対して抽象度はIInterのほうが高い。

2. 「どの」Func()を使う、に対してIInterの抽象度はAbstと同一か、高い。

[ メッセージ編集済み 編集者: lalupin4 編集日時 2006-06-10 10:37 ]

編集2:
1. 「「継承」は結合度が最も高い概念。」なので抽象度は同一か、低い。

1. 「「継承」は結合度が最も高い概念。」なのでAbstの抽象度はIInterと同一か、低い。

2. 継承ツリー上Abstより上にIInterがあればAbst.Hoge()をジャンプできる。なので抽象度は同一か、高い)。

2. 継承ツリー上Abstより上にIInterがあればAbst.Hoge()をジャンプできる。
なのでIInterの抽象度はAbstと同一か、高い。

[ メッセージ編集済み 編集者: lalupin4 編集日時 2006-06-10 10:52 ]
lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2006-06-10 10:40
引用:
lalupin4さんの書き込み (2006-06-09 22:36) より:
自明であり

 ぜんっぜん自明じゃなかったわ。挑発的に感じてた人がいたらごめんね。
ゴングラッチェ
常連さん
会議室デビュー日: 2006/03/03
投稿数: 36
投稿日時: 2006-06-10 11:51
オッス!
"抽象化"って単語が良く出てくるのに、"多態性"については触れてないのね。
ワシは"抽象化"はInterfaceが司り、"多態性"はAbstractが司っている風に思うのじゃがの。この話題に"多態性"は関係ないのかの?
"Abstract"は直訳すると"抽象的な"なわけではあるのじゃがの。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-06-10 15:47
引用:

インターフェイスは 「継承」 ではなく、「実装」 ではないかと思ってみたり...w



ですね。

C# の構文上は「継承」ですが、インターフェースを継承することは、その型がインターフェースで定義された機能を実装することを示します。

引用:

Interface と 抽象クラスの混在に問題があるかどうかは、設計次第でしょう。(どちらとも言えない)
逆に言えば、無計画に後付されたものは、問題を含んでいることが多いでしょう。



同感です。

C# 的(.NET 的?)は型のメタ情報を扱うための仕組み(=リフレクション)が充実しているので、インターフェースと抽象クラスの区別にはそれほど重要な意味は無さそうです。

派生クラス間で共有するべき実装があるなら抽象クラスを使い、実装を共有できなかったり共有する意味が無いときはインターフェース使う、というイージーな使い分けでも、大抵の場合は十分問題ないと思います。
lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2006-06-10 17:29
 くっそう…。System.ObjectがSystem.IObjectの実装クラスだったら
議論の余地はないのに…。
とか思ってみたり。

スキルアップ/キャリアアップ(JOB@IT)