[英]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>();
}
}
从您的问题尚不清楚要实现什么目标,但是似乎您需要通用约束才能解决此问题。 您可以使用一些不同的约束:
public class MyClass<T> where T : new()
public class MyClass<T> where T : SomeOtherClass
public class MyClass<T> where T : class
您可以通过用逗号分隔上述内容来组合它们,同时要记住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.