この質問に対する回答を見つけるのは難しく、既に質問されている場合はおそらく間違っています。私は、抽象基本クラスと派生クラスを持っています。パラメータとして抽象基本クラスを使用してインターフェイスメソッドを実装するときに派生クラスプロパティにアクセスする
interface IDoSomethingWithFoos
{
void DoSomethingWithFoo(Foo fooey);
}
:今
class Fum : Foo
{
public int UniqueProperty { get; set; }
}
私は抽象基本クラスを取るメソッドとのインタフェースを持っている:
abstract class Foo
{
protected int property1
protected int property2
// etc..
}
私derviedクラスは、基本クラスでは見られないいくつかの余分なプロパティが含まれています
インターフェイスを実装するクラス
class FumLover : IDoSomethingWithFoos
{
void DoSomethingWithFoo(Foo fooey)
{
// now in here i know i am going to be passed objects of Fum
// and i want to access its unique properties
fooey.UniqueProperty = 1; // this doesn't work
((Fum)fooey).UniqueProperty = 1; // this seems to work
// as does..
Fum refToFum = fooey as Fum;
refToFum.UniqueProperty = 1;
}
}
私の質問は次のとおりです:これについては正しい方法で行っていますか?これはコンパイルされますが、実際には正しく動作するかどうかを確認するのに十分なコードがありません。そして私の他の質問は、この悪いデザインですか?より良い方法がありますか?
*
あなたは、インターフェイスメソッドの代わりにはFooのFUMを取るている、FUMを渡ししようとしている場合は自然な反応は、あるので、もう少し詳しく説明し。
私のFumLoverクラスでは、メソッドDoSomethingWithFooは抽象バスクラスのプロパティで95%を処理しています。そして、Fieという別の派生クラスがあるとしましょう。これにはいくつかの固有のプロパティがあります。ここで、FieLoverクラスがあるとしましょう。ここで行うことの95%がFooに適用される可能性があるため、DoSomethingWithFooを実装したいと考えていますが、もう少しFieに固有のことが少しあります。
代替手段は何ですか。それぞれIDoSomethingWithFums、IDoSomethingWithFiesなどのインターフェースを用意するには?私はその違いの5%だけ抽象化をすべて失うようです。
hmmですが、私が間違っていれば修正しますが、インターフェイスは抽象クラスを取るので、常にFumや他のクラスのインスタンスで動作します。いくつかの固有のプロパティを追加しない場合、抽象クラスからクラスを派生させるポイントは何ですか?インターフェイスは「私はこの抽象基底クラスの派生クラスで動作しなければならないが、その独自の側面ではない」とほぼ同じです。 – suite16
これは当てはまりますが、通常、派生していないバージョンの型を受け入れるメソッドがある場合、より多くの派生プロパティにアクセスすることなくその型を行うことができると期待しています。これは必ずしも真実ではありません(通常、APIを公開しているとき)が、それはよくあります。私の主張は、あなたの実装が*派生型の*情報を必要とする場合、そのようなパラメータを宣言すると参考になるかもしれません。私が上で述べたように、あなたがそれを気にしないならば(少なくとも完全にうまくいけば)、少なくとも 'as'オプションを使います。したがって、あなたは不要な例外を投げかけません。 – dlev
@ suite16それは、インターフェイスが何を言っているのか(kind of)です。それぞれの派生クラスは異なる方法で動作させることができますが、1つの実装に固有のプロパティやメソッドについて知っていれば、最初は基本クラスを使用する利点がありません。 –