带有继承和接口的C#泛型where子句
我有一个类,我想成为泛型,其中带有继承和接口的C#泛型where子句,c#,C#,我有一个类,我想成为泛型,其中T被限制为任何派生类型的水果。我还希望该类从另一个类派生,并实现一个接口。不幸的是,我无法理解语法。这是我目前为止所做的,但它不起作用: public abstract class Food<T> where T : Fruit, BaseClass, IInterface {} 公共抽象类食物,其中T:Fruit,BaseClass,IInterface{} 这个想法是食品的特殊类只能是从水果派生的对象,比如苹果:水果=>食品,或者橙子:水果=>食
T
被限制为任何派生类型的水果。我还希望该类从另一个类派生,并实现一个接口。不幸的是,我无法理解语法。这是我目前为止所做的,但它不起作用:
public abstract class Food<T> where T : Fruit, BaseClass, IInterface {}
公共抽象类食物,其中T:Fruit,BaseClass,IInterface{}
这个想法是食品的特殊类
只能是从水果
派生的对象,比如苹果:水果=>食品
,或者橙子:水果=>食品
,我还希望食品
继承基类
,并实现IInterface
的成员
目前这是一个语法错误,我不知道如何正确地写出它。我怎么能做到这一点呢?它的意思是“食物与食物接触,t只能从水果中降下来”:
你问什么还不完全清楚,但这至少说明:
public class BaseClass {}
public interface IInterface{}
public class Fruit {}
public class Apple : Fruit {}
public class Orange : Fruit {}
public class Food<T> : BaseClass, IInterface where T : Fruit {}
公共类基类{}
公共接口接口{}
公共类水果{}
公营苹果:水果{}
公共级橙:水果{}
公共类食品:基类,接口,其中T:水果{}
A具有以下语法:
class_declaration
: attributes? class_modifier* 'partial'? 'class' identifier type_parameter_list?
class_base? type_parameter_constraints_clause* class_body ';'?
;
class_base
: ':' class_type
| ':' interface_type_list
| ':' class_type ',' interface_type_list
;
interface_type_list
: interface_type (',' interface_type)*
;
type_parameter_constraints_clause
: 'where' type_parameter ':' type_parameter_constraints
;
由于您希望食品
实现接口
并从基类
继承,因此它们是基类
规范的一部分,而不是后面的类型参数约束条款
(带有where
一词的部分)
从语法中,您可以看到class_base
将位于单词之前,其中
:
public abstract class Food<T>: BaseClass, IInterface where T : Fruit {}
公共抽象类Food:BaseClass,接口,其中T:Fruit{}
“因此,想法是,食品的派生类”
“我认为您误解了泛型约束的含义T:水果
约束
T,而非食品的衍生类别。你不能控制食物的子类做什么。你的意思是说食物应该继承水果,而食物应该继承基类,实现接口吗?也许我说错了,但基本上,如果我创建一个新的食品
,它只会接受水果
的类型,比如新食品()代码>或新食品()代码>我明白了,那么基类
和接口
呢?基类只是一个基类,食物从基类继承而来,我需要一个接口为以后的库存系统提供多态性。
class_declaration
: attributes? class_modifier* 'partial'? 'class' identifier type_parameter_list?
class_base? type_parameter_constraints_clause* class_body ';'?
;
class_base
: ':' class_type
| ':' interface_type_list
| ':' class_type ',' interface_type_list
;
interface_type_list
: interface_type (',' interface_type)*
;
type_parameter_constraints_clause
: 'where' type_parameter ':' type_parameter_constraints
;
public abstract class Food<T>: BaseClass, IInterface where T : Fruit {}