気になった事を自由に書いてます。
      
もう嫌だ!と思ったソースその@
タイトルにその@としてますが続くかどうかわかりません。
基本クラスと派生クラスのオーバーロード、オーバーライドが絡んだときの話です。
まずはソースを・・・

Form1.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        BaseClass d = new DerivedClass();
        string s = d.Call10();
        Console.WriteLine(s);
    }
}

BaseClass.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

public class BaseClass
{
    public string Call10()
    {
        return Call(10);
    }

    public virtual string Call(int i)
    {
        return Call(i, i*10);
    }

    public virtual string Call(int i, int j)
    {
        return "BaseClass Call(" + i + "," + j + ")";
    }
}

DerivedClass.cs
1
2
3
4
5
6
7
8
9
10
11
12

public class DerivedClass : BaseClass
{
    public override string Call(int i)
    {
        return base.Call(i);
    }

    public override string Call(int i, int j)
    {
        return "DerivedClass Call(" + i + "," + j + ")";
    }
}
もともとはBaseClassだけだったのですが、あるパターンだけ振る舞いを変えたいという
仕様からBaseClassを継承したDerivedClassを作りました。
BaseClassはこのクラス単体で動くことはできますが、DerivedClassは一部BaseClassの
機能を使っているため単独では動きません。
生成オブジェクトは設定値によりBaseClass、DerivedClassを切り替え可能としました。

もう嫌だ!と思ったのはソースを改変するときでした。
生成するオブジェクトがBaseClassのときは問題ありません。BaseClass.cs内から
呼び出し元を順々に追っていくことができます。ただDerivedClassはそうはいきません。
BaseClass.csとDerivedClass.csを行き来しながら呼び出し元を順々に追っていかないと
いけません。

こんな感じです。
もう嫌だ!と思ったソースその@

パッとみて、BaseClass.csのCall10( )のreturn Call(10)はBaseClass.csのCall(int i)に目が
移りませんか?せめてにDerivedClassオブジェクトの場合はDerivedClass.csを見てねという
コメントが欲しいです。できるだけ工数を減らせという理由からこうなったのは分かるけど
正直これはしんどい^^;

きれいにクラス設計しなくてもいいけど、せめてここまでは考えてほしかった。。

もう嫌だ!と思ったソースその@
今あるクラスを拡張(継承)したクラスの設計は注意が必要なのかも・・・。

      






Copyright (C) 2011 - 2015 猫の気ままなC#日記