■No8055に返信(一羽さんの記事)
>いちいち明示的にキャストして(ラベルを張り替えて)使うことになり、使う側からす>るとスマートでない感じがします。
私の場合,そこまで拘りがあるわけではないのですが,こういうことをしたいということですか?
<pre>
public abstract class AbstractClassDish : ICloneable
{
abstract protected object CloneImpl();
object ICloneable.Clone()
{
return this.CloneImpl();
}
}
public sealed class ClassSarada : AbstractClassDish
{
protected override object CloneImpl()
{
return this.Clone();
}
public ClassSarada Clone()
{
throw new Exception("The method or operation is not implemented.");
}
}
public sealed class ClassRice : AbstractClassDish
{
public readonly string RiceName;
public ClassRice(string name)
{
this.RiceName = name;
}
protected override object CloneImpl()
{
return this.Clone();
}
public ClassRice Clone()
{
return new ClassRice(RiceName);
}
}
public sealed class ClassSoup : AbstractClassDish
{
protected override object CloneImpl()
{
return this.Clone();
}
public ClassSoup Clone()
{
throw new Exception("The method or operation is not implemented.");
}
}
static class Program
{
static void Main(string[] args)
{
ClassRice rice = new ClassRice("コシヒカリ");
ClassRice riceClone = rice.Clone();
object objectClone = (rice as ICloneable).Clone();
}
}
</pre>
>NyaRuRuさまの言うとおり世の中すべてのクラスがClonableではないのですが、
>Clonableであることを強要する場面(ランチセットに含まれる料理はすべて
>複製できないと困りますよね)
>で、どうやれば「必ずClonableで」「使う側から見てもスマート」な実装が
>できるものか……。
強要するにはいくつか方法があって,確かにコンパイル時の型チェックもその1つです.
しかし,ユニットテストやコード検証ツールの併用といった方法もあり,必ずしもキャストの排除に全ての労力を注ぐ必要はないように思います.
実装漏れみたいなのを本当に不安視するなら,コンパイル後のテストでもある程度チェックしておくべきかと思いますが,そういうことはされていますか?