Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继承一个空接口可以吗?_C#_Oop_Generics_Marker Interfaces - Fatal编程技术网

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(); 
}