C#接口问题
如果我想要一堆类来实现一个方法,我可以让它们实现一个接口。 但是,如果我希望该方法始终使用两个自定义属性进行修饰,是否有语法?换句话说,我希望实现方法Run()的每个类都附加一个descriptionAttribute和一个versionAttributeC#接口问题,c#,C#,如果我想要一堆类来实现一个方法,我可以让它们实现一个接口。 但是,如果我希望该方法始终使用两个自定义属性进行修饰,是否有语法?换句话说,我希望实现方法Run()的每个类都附加一个descriptionAttribute和一个versionAttribute Update:是否有一种方法来实现实现Sun()的类,如果它们没有附加两个属性,则会产生编译错误吗?< P>没有强制编译的时间方法。 < P>也许您应该考虑使用抽象类? (我不太清楚你的问题) 您应该能够从基类中获取属性我认为没有内置的编译
Update:是否有一种方法来实现实现Sun()的类,如果它们没有附加两个属性,则会产生编译错误吗?
< P>没有强制编译的时间方法。 < P>也许您应该考虑使用抽象类? (我不太清楚你的问题)您应该能够从基类中获取属性我认为没有内置的编译时支持。但是,您可以绕过此问题的一种方法是创建一个程序或脚本,该程序或脚本在编译时通过使用项目构建事件运行 例如:
注意:这也可以作为“单元”测试来完成。初始化类时,可以使用抽象类来验证属性
abstract class MustImpliment
{
protected MustImpliment()
{
object[] attributes = this.GetType().GetCustomAttributes(typeof(DescriptionAttribute), true);
if (attributes == null || attributes.Length == 0)
throw new NotImplementedException("Pick a better exception");
}
// Must impliment DescriptionAttribute
public abstract void DoSomething();
}
class DidntImpliment : MustImpliment
{
public override void DoSomething()
{
// ...
}
}
更新:这不会导致编译器错误,但您可以按照Jerod Houghtelling的建议将其用作单元测试的一部分。如果您有一个抽象类,为什么还需要该接口?@Juliet——假设您正在对接口IRun编程,这样做不会影响其余代码。您应该删除
{}
并替换为
在RunBase+1中的抽象run方法中,这是一个很好的解决方案,但不是万无一失的。派生类可以添加具有不同错误值的属性的新版本。我假设每个实现的属性值都不同。如果这个假设是正确的,那么这个解决方案就没有好处了。@hunter:它们都是.NET,所以我认为这个例子可以很容易地移植到C#(可能只是语法/关键字的更改)。对,我刚刚注意到asker有16
rep,链接转到了VB,所以他可能无法将其移植到他/她自己身上。我看到的一个问题是多重继承问题。如果类已从对象继承,则可能不适合将MustImpliment
插入到该位置所在的链中。您不必担心编译错误,因为这些属性将始终存在于基类中
abstract class MustImpliment
{
protected MustImpliment()
{
object[] attributes = this.GetType().GetCustomAttributes(typeof(DescriptionAttribute), true);
if (attributes == null || attributes.Length == 0)
throw new NotImplementedException("Pick a better exception");
}
// Must impliment DescriptionAttribute
public abstract void DoSomething();
}
class DidntImpliment : MustImpliment
{
public override void DoSomething()
{
// ...
}
}