C# 子界面的使用

C# 子界面的使用,c#,interface,abstract-class,base-class,C#,Interface,Abstract Class,Base Class,我有一个用户控件,可以处理表单上的图像。但根据来源(网络摄像头、ID扫描或其他视频来源)的不同,用户控制是不同的 但是它们有一些共同的特性,所以我想创建一个基类 我的其他控件都有一些我需要的接口项。不过,我想在基本级别声明接口,而只是在类级别实现。但虚拟和覆盖似乎是最接近我想要的方式。是否有任何方法可以做到这一点,强制新类实现在基类上分配的接口?环顾四周,让类抽象化(我不完全理解)可能是一个开始。如果只是方法,那可能没问题,但我也在使用属性。在这方面,我在寻找答案的过程中已经走到了死胡同。这是我

我有一个用户控件,可以处理表单上的图像。但根据来源(网络摄像头、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 
     }    
  }

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

这篇文章供进一步参考

来自MSDN

性质

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

对静态属性使用抽象修饰符是错误的

  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;
    }
通过包含使用覆盖修饰符的属性声明,可以在派生类中覆盖抽象继承属性

以后继续

在本例中,DerivedClass类是从抽象类基类派生的。抽象类包含一个抽象方法AbstractMethod和两个抽象属性X和Y

带有接口的抽象基类

抽象类必须为所有接口成员提供实现

实现接口的抽象类可能将接口方法映射到抽象方法上。例如:


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

这篇文章供进一步参考

来自MSDN

性质

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

对静态属性使用抽象修饰符是错误的

  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;
    }
通过包含使用覆盖修饰符的属性声明,可以在派生类中覆盖抽象继承属性

以后继续

在本例中,DerivedClass类是从抽象类基类派生的。抽象类包含一个抽象方法AbstractMethod和两个抽象属性X和Y

带有接口的抽象基类

抽象类必须为所有接口成员提供实现

实现接口的抽象类可能将接口方法映射到抽象方法上。例如:


你在正确的轨道上。下面是一个简单的例子,说明您可以做些什么。使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()
    {

    }
}

你在正确的轨道上。下面是一个简单的例子,说明您可以做些什么。使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()
    {

    }
}

首先,按照惯例,接口应该以
I
开头,因此您的接口应该是
IRequiredAnswer

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

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

    public abstract void LabelRequiredFieldEmpty ();
}

然后,您的子类将必须实现该方法和属性。

首先,按照约定,接口应以
I
开头,因此您的接口将是
IRequiredAnswer

  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 abstract class ExtImage : UserControl, IRequiredAnswer
{
    public abstract bool AnswerRequired  { get; }

    public abstract void LabelRequiredFieldEmpty ();
}

然后,您的子类将必须实现该方法和属性。

对于创建接口,然后为您的目的定义一个抽象类,您已经走上了正确的道路

  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;
    }
接口的标准命名约定已被打破,但是,接口通常以I作为前缀,以帮助识别它们

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

我还建议将AnswerRequired属性更改为函数,正如您的具体类所说的“dosomthing to find result”。属性通常意味着快速,因此在属性中执行任何计算都会掩盖调用该属性时实际工作的发生。调用函数时,调用方更清楚地看到,结果不会立即实现。

创建接口,然后定义一个抽象类是正确的

接口的标准命名约定已被打破,但是,接口通常以I作为前缀,以帮助识别它们

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

我还建议将AnswerRequired属性更改为函数,正如您的具体类所说的“dosomthing to find result”。属性通常意味着快速,因此在属性中执行任何计算都会掩盖调用该属性时实际工作的发生。调用函数时,调用方更清楚地看到结果不会立即得到。

这是一个奇怪的括号样式,还是需要有人进行编辑?我来看看,没有人故意编辑过它,谢谢@BZinkIs一个奇怪的括号