繁体   English   中英

接口中的C#泛型类型用作占位符?

[英]C# generic types in interfaces as placeholders?

我正在尝试执行以下操作-

interface I1<PlaceHolder> {}
class C1 : I1<ActualClass> {
public Method() { ActualClass class = new ActualClass();}}

它可以工作,但是C#不允许以下操作-

interface IFactory<PlaceHolder> { I1 Create<PlaceHolder>(); } 
class ConcreteFactory<ActualClass> {
public I1 Create<ActualClass>() { return new C1(); //Won't work }
}

如果我尝试将通用类型添加到C1,则以下内容将不起作用

class C1<ActualClass> : I1<ActualClass> {
    public Method() { ActualClass class = new ActualClass(); //Won't work}
}

我想知道C#是否通过其语言功能允许上述实现?

编辑1

请在下面看到上述示例的更真实示例(ValidationResultA和ValidationResultB是不共享基类并且可能具有不同属性的具体类)-

interface IProcessor<Validator, ValidationResult> { 
ValidationResult ValidateProcess(); 
void RunProcess();
}

class ProcessorA : IProcessor<ValidatorA, ValidationResultA> {
ValidationResultA ValidateProcess() {
    ValidatorA validator = new ValidatorA();
    ValidationResultA result = validator.DoSomething();
    result.IsAAA = true;
    return result;
}

class ProcessorB : IProcessor<ValidatorB, ValidationResultB> {
ValidationResultB ValidateProcess() {
    ValidationResultB validator = new ValidationResultB();
    ValidationResultB result = validator.DoSomething();
    result.IsBBB = true;
    return validator;
}

然后我们可以创建返回IProcess的ProcessorFactory。

为此,我们实现了两件事:1.我们能够在返回类型上重载ValidateProcess'。 2.我们能够创建IProcessor的实现,并在其中插入各种Validator和ValidationResults。

如果要创建泛型的新实例,则需要

class MyClass<T> where T : new()

所以:-

interface I1<PlaceHolder>
{        
}
class C1<ActualClass> : I1<ActualClass> where ActualClass: new()
{
    public void Method()
    {
        ActualClass c = new ActualClass();
    }
}

interface IFactory<PlaceHolder> where PlaceHolder : new()
{
    I1<PlaceHolder> Create<PlaceHolder>(); 

}
class ConcreteFactory<ActualClass>  where ActualClass : new()
{
    public I1<ActualClass> Create()
    {
        return new C1<ActualClass>(); 
    }
}

从您的问题尚不清楚要实现什么目标,但是似乎您需要通用约束才能解决此问题。 您可以使用一些不同的约束:

  • T必须有一个空的构造函数: public class MyClass<T> where T : new()
  • T继承/实现基类/接口: public class MyClass<T> where T : SomeOtherClass
  • T是一个类: public class MyClass<T> where T : class
  • T是一个结构:`public class 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()

考虑到这一点,您追求的“我认为”是以下解决方案:

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

为什么您要这样做,超出了我的范围,但是上述实现有效。 您可以尝试使用通用约束,看看是否可以解决问题。

在另一种情况下,最好修改您的问题并举一个真实的例子。

这样编译:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM