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#_Generics_Inheritance_Factory - Fatal编程技术网

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