Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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# - Fatal编程技术网

C# 有可能把这两种类型联系在一起吗?

C# 有可能把这两种类型联系在一起吗?,c#,C#,这是一个思考练习。我不需要帮助简化此代码或在不关联类型的情况下完成相同的任务。代码是复杂的,因为它试图识别一种模式,如果没有替代方案,可以使用这种模式 其思想是看看是否可以在编译器强制执行的各种类型之间创建任意关系 我希望能够创建一组类型{T1,T2,T3,T4,…},它们以相同的方式与另一组类型{Ta,Tb,Tc,Td,…}相关。一旦建立了关系,我希望能够使用第二个集合中的类型,只使用第一个集合中的相关类型。例如,如果函数的类型为T5,那么它应该能够创建Te的实例,因为T5和Te是相关的 在下

这是一个思考练习。我不需要帮助简化此代码或在不关联类型的情况下完成相同的任务。代码是复杂的,因为它试图识别一种模式,如果没有替代方案,可以使用这种模式

其思想是看看是否可以在编译器强制执行的各种类型之间创建任意关系

我希望能够创建一组类型
{T1,T2,T3,T4,…}
,它们以相同的方式与另一组类型
{Ta,Tb,Tc,Td,…}
相关。一旦建立了关系,我希望能够使用第二个集合中的类型,只使用第一个集合中的相关类型。例如,如果函数的类型为T5,那么它应该能够创建Te的实例,因为T5和Te是相关的

在下面的示例中,我使用的是类型
{Nail,Screw}
,我想将它们与它们的制造商关联
{NailMaker,ScrewMaker}
。此思维练习的一个限制是使用类型钉子来创建钉子生成器,而不是使用钉子实例来创建钉子生成器

目标是能够使用第一个集合中的类型调用基类
Maker
的静态成员,以在第二个集合中生成相关类型的实例:

var factory = Maker<Nail>.Get()
我已经尝试过这个方法,效果很好:

public abstract class Maker<T>
{

    static public Maker<T> Get<T2>() where T2: Maker<T>, new()
    {
        return new T2();
    }
}
公共抽象类生成器
{
静态公共生成器Get(),其中T2:Maker,new()
{
返回新的T2();
}
}

但是,我希望它在不通过T2的情况下工作。

我不确定您将在何处应用它,但是参考您可以实现如下内容:

abstract class Maker {
   public abstract int SomeProperty { get; }
}

abstract class MakerFactory {
   public abstract Maker GetMaker();
}


class Nail:Maker {

}

class ConcreteNailFactory:NailFactory {
   public override Maker GetMaker() {
      return new Nail();
   }
}

编辑整个答案,因为这更清晰,更接近您的需要

首先是
Maker
类(您的
T2
)。您需要添加所需的通用属性和方法:

public class Maker 
{ 
    public string Name { get; set; } = ""; 
}
然后是描述零件并包含匹配的
Maker
类的
Part
父类

public class Part<T> where T : Maker 
{ 
    public static Type MakerType { get { return typeof(T); } } 
}
var nailMaker = Activator.CreateInstance(Nail.MakerType);    
var screwMaker = Activator.CreateInstance(Screw.MakerType);    
然后我们需要
部分
,以及他们所指的
T2
/
Maker

public class Nail : Part<NailMaker> { }

public class Screw : Part<ScrewMaker> { }

不要让它静止。实例化工厂的一个实例。让它保持静态会破坏使用工厂的可测试性为什么您需要一个工厂来创建工厂实例?您知道使用通用
生成器
不需要您拥有
Nail
的实例,对吧?然后实例化它。你的设计毫无意义。@MustafaOzturk它不是方法签名的一部分。它在结果类型中。你没有提供它。我说得再清楚不过了。除非以某种方式将类型传递到方法中,否则无法更改返回类型。只有C#允许
virtual
abstract
方法是静态的,而这在语言中是不可能的。如果是这样的话,那将使如何获得它变得复杂,因为在您访问static@MustafaOzturk我已经修改了一些东西,使之尽可能接近
T2
,而无需实例化
部分
类。
public class Nail : Part<NailMaker> { }

public class Screw : Part<ScrewMaker> { }
var nailMaker = Activator.CreateInstance(Nail.MakerType);    
var screwMaker = Activator.CreateInstance(Screw.MakerType);