首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在任何编译语言中实现以下语法(适用于工厂设计模式)?最好是Kotlin,C++

在任何编译语言中实现以下语法(适用于工厂设计模式)?最好是Kotlin,C++
EN

Stack Overflow用户
提问于 2019-03-31 19:19:49
回答 1查看 139关注 0票数 -1

我想知道以下语法是否可用于编译后的语言?请不要提供java,因为它需要JVM。这种设计相当于工厂设计模式,因为我们初始化一个类,一旦一些测试通过,在正常情况下,我们使用大量的if-else语句,也就是说,当我们有一系列的类,即10个类时,代码变得笨重,我正在尝试创建一种转译或编译的语言,还没有决定这一点,并将研究目前使用kotlin-native和llvm (尚未排序的llvm集成)的已编译语言的特性功能。它是在启动时使用的,这也是我想要考虑使用的。

class A{
   
}

class B extends A{
  
}



class C extends A{
   
}

class D extends A{
   
}

class E extends A{
   
}

class F extends A{
   
}

class G extends A{
   
}

class H extends A{
   
}

class I extends A{
   
}

class J extends A{
   
}

class K extends A{
   
}
function getClass(test){
    if(test == 1){
      return new B()
    }else if (test == 2){
      return new C()
    }else if (test == 3){
      return new D()
    }else if (test == 4){
      return new E()
    }else if (test == 5){
      return new F()
    }else if (test == 6){
      return new G()
    }else if (test == 7){
      return new H()
    }else if (test == 8){
      return new I()
    }else if (test == 9){
      return new J()
    }else if (test == 10){
      return new K()
    }
}

let klass = getClass(10)

console.log(`Found class ${klass.constructor.name}`)

class A {    
    static test(test) {
        return test === this.index;
    }
}


class B extends A{}

B.index = 1

class C extends A{}

C.index = 2

class D extends A{}

D.index = 3

class E extends A{}

E.index = 4

class F extends A{}

F.index = 5

class G extends A{}

G.index = 6

class H extends A{}

H.index = 7

class I extends A{}

I.index = 8

class J extends A{}

J.index = 9

class K extends A{}

K.index = 10

let klasses = [B, C,D,E,F,G,H,I,G,K];

let klass = new A();

let test = 7;

for (let i = 0; i < klasses.length; i++) {
    try {
      if(klasses[i].test(test)){
          klass =  new klasses[i]()
      }
    } catch (e) {
        console.log(e)
    }
}


console.log(`Found class ${klass.constructor.name}`);

EN

回答 1

Stack Overflow用户

发布于 2019-03-31 20:40:45

你能澄清你的问题吗?你之前的问题How can I achieve the below syntax in any compiled language? preferably Kotlin, C++对我来说似乎更清楚了。您能给我们介绍一下您正在尝试实现的高级目标吗?

你在尝试设计一门新的语言吗?您是否正在尝试选择一种语言来实现新语言的解析器?

根据您的代码,您正在尝试设计一种语言,其中类按声明的顺序作为列表保存,然后您希望能够通过以某种方式迭代列表来实例化所有这些类,并且这些类应该能够知道自己在列表中的索引以供其他用途?

这就是你想要做的吗?

在大多数语言中,类不能保存在数组中。它们不是真正的对象。但是像Smalltalk,Objective-C,Self或者TADS,它们会隐式地为每个包含额外数据的类创建一个对象(C++的缩写形式称为“运行时类型信息”,或RTTI)。

如果你的实现语言不能做到这一点,你就得自己去做。创建包含创建正确子类的对象的函数的对象(可能还包含一些其他信息,如类名或列表中的索引,以便您可以再次找到它),并将"maker“对象添加到全局列表中。然后,只需使用工厂对象的全局列表来创建实例。

你并没有说你是如何创建你的语言的。您是否正在编写一个工具来读取您所使用的语言的文本文件,并将其转换为现有语言的源文件?然后,该工具只需为一些额外的类创建源代码(例如,对于class B,它还将创建一个class B_Maker,它是class A_Maker的子类,但它将创建一个新的B类型的对象,然后它将创建一些包含代码的init()函数,以创建每个maker的新对象并将其添加到全局列表中)。

如果您正在修改LLVM或其他一些现有的编译器链,或者尝试从头开始修改,那么基本的方法是相同的(除非每个类都已经有一个可以扩展的现有对象),但是您不会生成源代码,而是生成一些其他的数据结构,这些数据结构最终会导致编译等价的代码。

给我们更多的背景信息,我们也许能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55440369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档