0

フォーム上の画像を処理するユーザーコントロールがあります。ただし、ソース(WebカメラまたはIDスキャンまたはその他のビデオソース)によって、ユーザーコントロールは異なります。

しかし、それらはいくつかの共通の機能を共有しているので、基本クラスを作成したいと思います。

私の他のコントロールにはすべて、必要なインターフェイス項目がいくつかあります。ただし、基本レベルでインターフェイスを宣言し、クラスレベルで実装したいと思います。しかし、仮想とオーバーライドは、私が欲しいものを取得するための最も近い方法のようです。それを行うために何かありますか、新しいクラスに基本クラスで割り当てられたインターフェイスを実装するように強制しますか?周りを見回すと、クラスを抽象化する(私は完全には理解していません)ことが始まりかもしれません。それが大丈夫かもしれないメソッドだけだったとしても、私はプロパティも使用しています。その分野では、答えを探すのに行き詰まりました。これが私がこれまでに持っているものです。私は正しい方向に進んでいますか?私は抽象クラスをまったく扱ったことがなく、インターフェースへの露出が限られています。調査の結果、私は正しい方法を持っていると思いますが、プロパティについてはよくわかりません。

  public interface RequiredAnswer
  {
    void LabelRequiredFieldEmpty();
    bool AnswerRequired{ get;}
  }


  public abstract partial class ExtImage : UserControl, RequiredAnswer
  {
    public virtual bool AnswerRequired
    {
      get
      {
         throw new NotImplementedException ("Answer Required");
      }
    }
    public abstract void LabelRequiredFieldEmpty ()
    {
        //checkBox_AgreementAcceptedText.ForeColor = Color.Red;
    }

だから私はクラスを持っているでしょう

  public partial class ExtImageWebCam : ExtImage
  {
    public override bool AnswerRequired
    {
      get
      {
        return valueFromThisClassThatMeansAnAnswerIsRequired;
      }
    }

     public override void LabelRequiredFieldEmpty ()
     {
       // do something 
     }    
  }
4

4 に答える 4

2

メソッドabstractを宣言するときは、基本的に、子クラスがメソッドの定義を提供する必要があると言っています。プロパティを抽象化できます。これはまさにあなたが必要としているもののように聞こえます。

詳細については、MSDNの記事を参照してください。

MSDNから

プロパティ

抽象プロパティは、宣言と呼び出し構文の違いを除いて、抽象メソッドのように動作します。

静的プロパティで抽象修飾子を使用するとエラーになります。

抽象継承プロパティは、オーバーライド修飾子を使用するプロパティ宣言を含めることにより、派生クラスでオーバーライドできます。

後で続ける

この例では、クラスDerivedClassは抽象クラスBaseClassから派生しています。抽象クラスには、抽象メソッドAbstractMethodと、2つの抽象プロパティXおよびYが含まれています。

abstract class BaseClass   // Abstract class
{
    protected int _x = 100;
    protected int _y = 150;
    public abstract void AbstractMethod();   // Abstract method
    public abstract int X    { get; }
    public abstract int Y    { get; }
}

インターフェイスを備えた抽象基本クラス

抽象クラスは、すべてのインターフェイスメンバーに実装を提供する必要があります。

インターフェイスを実装する抽象クラスは、インターフェイスメソッドを抽象メソッドにマップする場合があります。例えば:

interface I
{
    void M();
}
abstract class C : I
{
    public abstract void M();
}
于 2012-09-26T20:19:53.603 に答える
1

あなたは正しい方向に進んでいます。これがあなたができることの簡単な例です。Bar()メソッドを抽象化すると、継承者はそれを実装する必要があります。

public interface IFoo{
    void Bar();
}

public abstract class BaseFoo : IFoo
{
    public abstract void Bar();

    public void Implemented(){
        Debug.WriteLine("this is a shared implementation");
    }
}

public class KungFoo : BaseFoo{
    public override void Bar()
    {

    }
}
于 2012-09-26T20:22:59.090 に答える
1

まず第一に、インターフェースはIby 規則で開始する必要があるため、インターフェースはIRequiredAnswer.

第 2 に、継承されたクラスに継承ではなく独自のメソッドを強制的に実装させたい場合は、基本クラスで抽象化するだけです。

public abstract class ExtImage : UserControl, IRequiredAnswer
{
    public abstract bool AnswerRequired  { get; }

    public abstract void LabelRequiredFieldEmpty ();
}

子クラスは、メソッドとプロパティを実装する必要があります。

于 2012-09-26T20:23:39.763 に答える
0

インターフェイスを作成し、目的に合わせて抽象クラスを定義するための正しい軌道に乗っています。

インターフェイスの標準的な命名規則は破られていますが、インターフェイスには通常、識別しやすいように接頭辞 I が付けられます

public interface IRequiresAnswer
{
   void LabelRequiredFieldEmpty();
   bool AnswerRequired { get;  }
}

具体的なクラスが「結果を見つけるために何かをする」と言っているので、 AnswerRequired プロパティを関数に変更することもお勧めします。プロパティは通常、高速であることを意図しているため、プロパティ内で計算を実行すると、プロパティを呼び出すときに実際の作業が行われることが隠されます。関数を使用すると、結果がすぐに得られないことが呼び出し元にとってより明白になります。

于 2012-09-26T20:25:44.857 に答える