C#接口中的泛型类型作为占位符?
我试着做以下几点-C#接口中的泛型类型作为占位符?,c#,generics,inheritance,factory,C#,Generics,Inheritance,Factory,我试着做以下几点- interface I1<PlaceHolder> {} class C1 : I1<ActualClass> { public Method() { ActualClass class = new ActualClass();}} 接口I1{} 类别C1:I1{ 公共方法(){ActualClass class=new ActualClass();}} 它可以工作,但是C#不允许下面的代码- interface IFactory<Place
interface I1<PlaceHolder> {}
class C1 : I1<ActualClass> {
public Method() { ActualClass class = new ActualClass();}}
接口I1{}
类别C1:I1{
公共方法(){ActualClass class=new ActualClass();}}
它可以工作,但是C#不允许下面的代码-
interface IFactory<PlaceHolder> { I1 Create<PlaceHolder>(); }
class ConcreteFactory<ActualClass> {
public I1 Create<ActualClass>() { return new C1(); //Won't work }
}
接口IFactory{I1 Create();}
二级混凝土厂{
public I1 Create(){return new C1();//不起作用}
}
如果我尝试将泛型类型添加到C1中,那么下面的方法将不起作用
class C1<ActualClass> : I1<ActualClass> {
public Method() { ActualClass class = new ActualClass(); //Won't work}
}
类别C1:I1{
public方法(){ActualClass class=new ActualClass();//不起作用}
}
我想知道C#是否允许通过其语言特性实现上述功能
编辑1:
请参见下面更真实的上述示例(ValidationResultA和ValidationResultB是不共享基类且可能具有不同属性的具体类)-
接口i处理器{
ValidationResult ValidateProcess();
void RunProcess();
}
类Processor:IPProcessor{
ValidationResultA ValidateProcess(){
ValidatorA validator=新的ValidatorA();
ValidationResultA结果=validator.DoSomething();
result.IsAAA=true;
返回结果;
}
类ProcessorB:IPProcessor{
ValidationResultB ValidateProcess(){
ValidationResultB validator=新的ValidationResultB();
ValidationResultB result=validator.DoSomething();
result.IsBBB=true;
返回验证器;
}
然后我们可以创建ProcessorFactory,返回IProcess
我们用这个实现了两件事-
1.我们能够在返回类型上重载ValidateProcess。
2.我们能够创建IPProcessor的实现,并在其中插入各种验证器和ValidationResults。如果您想创建所需的泛型类型的新实例
class MyClass<T> where T : new()
classmyclass,其中T:new()
因此:-
接口I1
{
}
类别C1:I1,其中实际类别:new()
{
公开作废法()
{
实际类c=新的实际类();
}
}
接口IFactory,其中占位符:new()
{
I1创建();
}
类ConcreteFactory,其中实际类:new()
{
公共I1创建()
{
返回新的C1();
}
}
如果要创建所需泛型类型的新实例
class MyClass<T> where T : new()
classmyclass,其中T:new()
因此:-
接口I1
{
}
类别C1:I1,其中实际类别:new()
{
公开作废法()
{
实际类c=新的实际类();
}
}
接口IFactory,其中占位符:new()
{
I1创建();
}
类ConcreteFactory,其中实际类:new()
{
公共I1创建()
{
返回新的C1();
}
}
您的问题不清楚您想要实现什么,但似乎您需要通用约束来解决此问题。您可以使用以下几种不同的约束:
- T必须有一个空构造函数:
公共类MyClass,其中T:new()
- T继承/实现基类/接口:
公共类MyClass,其中T:SomeOtherClass
- T是一个类:
公共类MyClass,其中T:class
- T是一个struct:`公共类MyClass,其中T:struct
new()
约束始终需要最后一个,例如:
// T must implement IDisposable, inherit from SomeClass and have a public
// parameterless constructor
public class MyClass<T> where T : IDisposable, SomeClass, new()
//T必须实现IDisposable、从某个类继承并具有公共
//无参数构造函数
公共类MyClass,其中T:IDisposable,SomeClass,new()
考虑到这一点,您所追求的“我认为”是以下解决方案:
interface I1<T>
{
}
class ActualClass
{
}
class C1 : I1<ActualClass>
{
public C1()
{
ActualClass class1 = new ActualClass();
}
}
interface IFactory
{
I1<T> Create<T>();
}
class ConcreteFactory
{
public I1<T> Create<T>() where T : I1<T>, new()
{
return new T();
}
}
接口I1
{
}
类实际类
{
}
类别C1:I1
{
公共C1()
{
ActualClass class1=新的ActualClass();
}
}
接口工厂
{
I1创建();
}
二级混凝土厂
{
public I1 Create(),其中T:I1,new()
{
返回新的T();
}
}
我无法理解您为什么要这样做,但是上面的实现是有效的。您可以使用通用约束来查看您是否解决了问题
在另一种情况下,最好修改您的问题并给我们一个真实的例子。您的问题不清楚您试图实现什么,但似乎您需要通用约束来解决此问题。您可以使用以下几种不同的约束:
- T必须有一个空构造函数:
公共类MyClass,其中T:new()
- T继承/实现基类/接口:
公共类MyClass,其中T:SomeOtherClass
- T是一个类:
公共类MyClass,其中T:class
- T是一个struct:`公共类MyClass,其中T:struct
new()
约束始终需要最后一个,例如:
// T must implement IDisposable, inherit from SomeClass and have a public
// parameterless constructor
public class MyClass<T> where T : IDisposable, SomeClass, new()
//T必须实现IDisposable、从某个类继承并具有公共
//无参数构造函数
公共类MyClass,其中T:IDisposable,SomeClass,new()
考虑到这一点,您所追求的“我认为”是以下解决方案:
interface I1<T>
{
}
class ActualClass
{
}
class C1 : I1<ActualClass>
{
public C1()
{
ActualClass class1 = new ActualClass();
}
}
interface IFactory
{
I1<T> Create<T>();
}
class ConcreteFactory
{
public I1<T> Create<T>() where T : I1<T>, new()
{
return new T();
}
}
接口I1
{
}
类实际类
{
}
类别C1:I1
{
公共C1()
{
ActualClass class1=新的ActualClass();
}
}
接口工厂
{
I1创建();
}
二级混凝土厂
{
public I1 Create(),其中T:I1,new()
{
返回新的T();
}
}
我无法理解您为什么要这样做,但是上面的实现是有效的。您可以使用通用约束来查看您是否解决了问题
在另一种情况下,最好修改您的问题,并给我们一个真实的例子。这将编译:
interface I1<PlaceHolder> where PlaceHolder : new() { }
class ActualClass {}
class C1 : I1<ActualClass>
{
public void Method() { ActualClass @class = new ActualClass();}
}
interface IFactory<PlaceHolder> where PlaceHolder : new()
{
I1<PlaceHolder> Create();
}
class ConcreteFactory : IFactory<ActualClass>
{
public I1<ActualClass> Create() { return new C1(); }
}
接口I1,其中占位符:new(){}
类实际类{}
类别C1:I1
{
public void方法(){ActualClass@class=new ActualClass();}
}
接口IFactory,其中占位符:new()
{
I1创建();
}
混凝土工厂类别:IFactory
{
public I1 Create(){返回新C1();}
}