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