10

いくつかの抽象メソッドを持つクラスがありますが、デザイナーでそのクラスのサブクラスを編集できるようにしたいと考えています。ただし、親クラスのインスタンスを作成できない限り、デザイナーはサブクラスを編集できません。したがって、私の計画は、抽象メソッドをスタブに置き換えて仮想としてマークすることですが、別のサブクラスを作成すると、それらを実装するのを忘れてもコンパイル時エラーは発生しません。

メソッドを抽象としてマークせずに、サブクラスで実装する必要があるようにメソッドをマークする方法はありますか?

4

7 に答える 7

9

#ifつまり、DEBUG(デザイナーにとっては)仮想的ですが、抽象RELEASE的です。ただし、維持するのは本当に苦痛です。

しかし、それ以外:基本的にはありません。デザイナーのサポートが必要な場合は抽象化できないため、「仮想」のままになります(おそらくベースメソッドが をスローしますNotImplementedException)。

もちろん、単体テストでは、メソッドが実装されていることを確認しますよね? ;-p

実際には、ジェネリックを介してテストするのはおそらく非常に簡単です-つまり、次の形式のジェネリックテストメソッドがあります。

[Test]
public void TestFoo() {
  ActualTest<Foo>();
}
[Test]
public void TestBar() {
  ActualTest<Bar>();
}

static void ActualTest<T>() where T : SomeBaseClass, new() {
  T obj = new T();
  Assert.blah something involving obj
}
于 2008-10-27T09:32:54.553 に答える
5

クラスで実装イディオムへの参照を使用できます。

public class DesignerHappy
{
    private ADesignerHappyImp imp_;

    public int MyMethod()
    {
        return imp_.MyMethod()    
    }

    public int MyProperty
    {
        get { return imp_.MyProperty; }
        set { imp_.MyProperty = value; }
    }
}

public abstract class ADesignerHappyImp
{
    public abstract int MyMethod();
    public int MyProperty {get; set;}
}

DesignerHappy は必要なインターフェイスを公開するだけで、すべての呼び出しを実装オブジェクトに転送します。ADesignerHappyImp をサブクラス化することで動作を拡張します。これにより、すべての抽象メンバーの実装が強制されます。

ADesignerHappyImp のデフォルト実装を提供できます。これはデフォルトで DesignerHappy を初期化し、実装を変更できるプロパティを公開するために使用されます。

于 2008-10-27T16:01:34.580 に答える
1

「DesignMode」はコンストラクターで設定されないことに注意してください。VS が InitializeComponents() メソッドを解析した後に設定されます。

于 2008-11-20T16:36:21.430 に答える
0

原則として、言語に何かをする方法がない場合、それは一般的にそれをしないという良い概念的な理由があることを意味します。

これは言語設計者の責任である場合もありますが、多くはありません。通常、彼らは私よりも言語デザインについてよく知っていると思います;-)

この場合、オーバーライドされていない仮想メソッドでコンパイル時例外(ではなく実行時例外)をスローする必要があります。基本的には抽象的なメソッドです。

仮想メソッドを抽象的なメソッドのように動作させることは、将来的に混乱の世界を作り出すことになります。

一方、VSプラグインの設計は、多くの場合、まったく同じレベルではありません(これは少し不公平ですが、言語設計の段階よりも厳密さは確かに低くなります-そして当然のことながら)。クラスデザイナーや現在のWPFエディターなど、一部のVSツールは優れたアイデアですが、実際には完全ではありません。

あなたが説明している場合、あなたはクラスデザイナを使用しないという議論があり、コードをハッキングするという議論はないと思います。

ある時点で(おそらく次のVSで)、クラスデザイナーが抽象クラスをどのように処理するかを整理します。その後、なぜそのようにコーディングされたのかわからないハックが発生します。

デザイナーに合うようにコードをハッキングする最後の手段であり、ハッキングを最小限に抑えようとする場合は常にそうする必要があります。私は通常、現在壊れているツールで機能するビザンチンのコードよりもすぐに意味のある簡潔で読みやすいコードを持っている方が良いと思います。

于 2008-10-27T17:11:04.893 に答える
0

例として ms を使用するには...

Microsoft は、Silverlight のユーザー コントロール テンプレートを使用してこれを行います。#if は完全に受け入れられますが、ツールがすぐにそれを回避できるかどうかは疑わしいです。私見では

于 2011-10-19T02:26:29.743 に答える
0

私はそれがあなたが求めているものではないことを知っていますが、基本クラスのすべてのスタブに NotImplementedException をスローさせることができます。次に、サブクラスのいずれかがそれらをオーバーライドしていない場合、基本クラスのメソッドが呼び出されたときに実行時例外が発生します。

于 2008-10-27T10:15:16.353 に答える
0

Component クラスには、「DesignMode」と呼ばれるブール値のプロパティが含まれています。これは、実行時とは異なるデザイナーでのコードの動作が必要な場合に非常に便利です。この場合、何かの役に立つかもしれません。

于 2008-10-27T15:20:32.650 に答える