0

我有一个将处理表单上的图像的用户控件。但是根据源是什么(网络摄像头或 ID 扫描或其他视频源),用户控制是不同的。

但是它们有一些共同的特性,所以我想创建一个基类。

我的其他控件都有一些我需要的界面项。我想在基础级别声明接口,并在类级别实现。但 virtual 和 override 似乎是获得我想要的最接近的方式。有没有办法,强制新类实现基类分配的接口?环顾四周,让类抽象化(我不完全理解)可能是一个开始。如果只是方法可能没问题,但我也在使用属性。在那个领域,我在寻找答案时遇到了死胡同。这是我到目前为止所拥有的。我在正确的轨道上吗?我只是根本没有使用过抽象类,只接触过有限的接口。从研究来看,我认为我的方法是正确的,只是不确定该属性。

  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

当您声明方法抽象时,您基本上是在说子类必须提供方法的定义。您可以使属性抽象。这听起来正是您所需要的。

这是MSDN文章以供进一步参考。

来自 MSDN

特性

抽象属性的行为类似于抽象方法,除了声明和调用语法的不同。

在静态属性上使用 abstract 修饰符是错误的。

通过包含使用 override 修饰符的属性声明,可以在派生类中覆盖抽象继承属性。

稍后继续

在此示例中,类 DerivedClass 派生自抽象类 BaseClass。抽象类包含一个抽象方法 AbstractMethod 和两个抽象属性 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

首先,接口应该I以约定俗成的开头,所以你的接口应该是IRequiredAnswer.

其次,如果要强制继承的类实现自己的方法而不是继承它们,只需在基类中将它们抽象:

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 回答