1

私は以下のように定義された基本クラスを持っています(私はDevExpressコンポーネントも使用しています):

public abstract partial class BaseFormClass<R> : XtraForm where R : DataRow
{
  ...
}

他の場所から読んだものとは反対に、私はまだこのクラスを設計することができます。そのために、そこから具体的なクラスを作成する必要はありませんでした。ただし、その子孫である具象クラスを作成すると(以下のように)、そのクラスはデザイナでは機能しません。

public partial class ConcreteFormClass : BaseFormClass<StronglyTypedRow>
{
  ...
}

このメッセージが表示されます:

このファイル内のどのクラスも設計できないため、このファイルの設計者を表示できませんでした。デザイナは、ファイル内の次のクラスを検査しました。ConcreteFormClass---基本クラス'BaseFormClass'をロードできませんでした。アセンブリが参照されていること、およびすべてのプロジェクトがビルドされていることを確認してください。

誰かがこれを見たことがありますか?既知の回避策はありますか?

4

2 に答える 2

4

申し訳ありませんが、これはうまくいきません(これは残念です。過去にもこれができることを望んでいました)。問題は、設計者の基本的な方法論です。

フォームのモデルを提示するために、実際にはフォーム自体を作成しようとはしません。それが行われた場合、他の問題が発生します-フォームにパラメーターのないコンストラクターがない場合はどうなりますか?代わりに、フォームの基本クラスのインスタンスを実際にインスタンス化します。次に、InitializeComponents()メソッドをスイープし、そこで定義したすべてのコントロールをベースフォームに「レイヤーオン」します。

したがって、これが機能しない理由は明らかです。のインスタンスを設計できます。これを設計するために、具体的なBaseFormClassのインスタンスが作成されるためです。XtraFormただし、のインスタンスを設計することはできません。そのためには、抽象であるConcreteFormClassのインスタンスを作成する必要があるためです。BaseFormClass

このための最も簡単な回避策は、BaseFormClass非抽象化することです。(誰も作成できないことを絶対に確認したい場合は、デフォルトのコンストラクターをプライベートにすることができますか?デザイナーがそれを処理できるかどうかはわかりませんが、なぜそれができなかったのかわかりません。)それが人生だ。Microsoftに文句を言うと、VisualStudio2012の方が良いかもしれません。

于 2009-05-15T17:36:05.123 に答える
0

これは、デザイナに抽象的な基本クラスを持つフォームをレンダリングさせるのと非常によく似た問題のように聞こえます。私は一般的な多重継承を行っていませんが、少なくとも私のアプローチを試して、それが機能するかどうかを確認することができます。

編集:うん、わかりました、試してみました、私の解決策は確かに機能します。ミドルクラスの定義とフォームの定義を変更する必要があります(でラップされています#if DEBUG

あなたがそれを試すことができるかどうか私に知らせてください!

于 2010-03-09T06:51:42.533 に答える