C# 继承一个空接口可以吗?
我有一个通用方法:C# 继承一个空接口可以吗?,c#,oop,generics,marker-interfaces,C#,Oop,Generics,Marker Interfaces,我有一个通用方法: public void Send < TBiz, TEntity > (string serviceName, string pkName) where TEntity: class, IEntity where TBiz: class, BLL.Modules.INewSend { var biz = DependencyFactory.Get < TBiz > ()
public void Send < TBiz, TEntity > (string serviceName, string pkName)
where TEntity: class, IEntity
where TBiz: class, BLL.Modules.INewSend
{
var biz = DependencyFactory.Get < TBiz > ();
var query = (biz.GetNotSent() as IEnumerable < TEntity > );
NewSender < TBiz, TEntity > (serviceName, pkName, query);
}
或
TBiz是我的业务类,它实现了INewSend
INewSend
是一个简单的接口,有两个实现:
public interface INewSend {
void Send(long id, string userName);
IEnumerable < IEntity > GetNotSent();
}
公共接口INewSend{
无效发送(长id,字符串用户名);
IEnumerableGetNotSent();
}
这段代码工作得很好,但我很好奇,就面向对象的原则而言,TEntity
类继承IEntity
接口是空的?我这样做是为了将不同的类(所有这些类都继承IEntity
接口)传递给Send
方法。
IEntity
接口也可以是具有ID
属性的接口,但我认为这不会改变问题,因为实现此接口的实体的类型完全不同,尽管它们都具有ID
属性
根据面向对象原则,TEntity类继承空的IEntity接口可以吗
没有OO原则会说拥有一个空的接口/空的类/空的任何东西都是不好的,甚至是禁止的
从OO的角度来看,接口和类表示对象的(部分)标识。因此,接口本身携带信息,而不管它是否为空,也就是说,它定义了任何成员
使用空接口作为所谓的标记接口是一种常见的做法,尽管还有其他方法来表示相同的意图,例如属性,每种方法都有。从OO的角度来看,空接口的有效性是一个非常简单的问题,与此不同,在特定场景中是否使用标记接口或属性是基于观点的
我这样做是为了将不同的类(所有这些类都继承了IEntity接口)传递给Send方法
为了拥有GetNotSent
方法的强类型契约,您必须至少提供一些类似于祖先的公共类型。无论是接口(是否为空)还是公共祖先类,都取决于您的具体设计
IEntity接口也可以是具有ID属性的接口,但我认为这不会改变问题,因为实现此接口的实体的类型完全不同,尽管它们都具有ID属性
接口的要点是为“完全不同的类型”提供一个视图。因此,我将尝试指定每个类为了“成为一个实体”必须实现的公共属性,并将它们考虑到属性中。这很有道理。然后,INewSend
接口可以使用它,并提供更一致的合同:
public interface INewSend
{
void Send(IEntity entity, string userName); // pass entity instead of its ID
IEnumerable <IEntity> GetNotSent();
}
公共接口INewSend
{
void Send(entity实体,字符串用户名);//传递实体而不是其ID
IEnumerable GetNotSent();
}
_注意:出于示例的考虑,我假设最初传递到Send
的id
是实体的id
根据面向对象原则,TEntity类继承空的IEntity接口可以吗
没有OO原则会说拥有一个空的接口/空的类/空的任何东西都是不好的,甚至是禁止的
从OO的角度来看,接口和类表示对象的(部分)标识。因此,接口本身携带信息,而不管它是否为空,也就是说,它定义了任何成员
使用空接口作为所谓的标记接口是一种常见的做法,尽管还有其他方法来表示相同的意图,例如属性,每种方法都有。从OO的角度来看,空接口的有效性是一个非常简单的问题,与此不同,在特定场景中是否使用标记接口或属性是基于观点的
我这样做是为了将不同的类(所有这些类都继承了IEntity接口)传递给Send方法
为了拥有GetNotSent
方法的强类型契约,您必须至少提供一些类似于祖先的公共类型。无论是接口(是否为空)还是公共祖先类,都取决于您的具体设计
IEntity接口也可以是具有ID属性的接口,但我认为这不会改变问题,因为实现此接口的实体的类型完全不同,尽管它们都具有ID属性
接口的要点是为“完全不同的类型”提供一个视图。因此,我将尝试指定每个类为了“成为一个实体”必须实现的公共属性,并将它们考虑到属性中。这很有道理。然后,INewSend
接口可以使用它,并提供更一致的合同:
public interface INewSend
{
void Send(IEntity entity, string userName); // pass entity instead of its ID
IEnumerable <IEntity> GetNotSent();
}
公共接口INewSend
{
void Send(entity实体,字符串用户名);//传递实体而不是其ID
IEnumerable GetNotSent();
}
_注意:出于示例的考虑,我确实假设最初传递到Send
的id
是一个实体的id。没关系,有时我使用一个空接口来对实体进行分类。没关系,有时我使用一个空接口来对实体进行分类。这两个方面都有原因,使这个问题有相当的舆论基础。从我的角度来看,拥有一个标记接口是相当不错的。这种接口通常被称为“标记接口”——对于它们是否是一件好事,意见分歧。你应该能够找到一些不同的意见,通过搜索这个术语好的问题,除了它属于这不是这样,所以我会留下一个答案
public interface INewSend
{
void Send(IEntity entity, string userName); // pass entity instead of its ID
IEnumerable <IEntity> GetNotSent();
}