Go 中是否有与 Java 等语言提供的动态类实例化功能等效的东西(注意:为了简洁,这里省略了必要的异常处理逻辑):
Class cls = Class.forName("org.company.domain.User");
Constructor<User> userConstructor = cls.getConstructor();
User user1 = userConstructor.newInstance();
Run Code Online (Sandbox Code Playgroud)
上面的简短 Java 代码片段本质上是通过提供的完全限定的类路径字符串获取对类的引用,然后使用类引用来获取对零参数构造函数(如果存在)的引用,最后使用构造函数来获取对类的实例。
我还没有在 Go 中找到可以实现类似结果的类似机制的示例。更具体地说,Go 中的Reflect包似乎要求调用者已经引用了他们希望实例化的结构类型。这方面的标准习惯用法似乎如下:
reflect.New(reflect.TypeOf(domain.User))
Run Code Online (Sandbox Code Playgroud)
注意:提供给reflect.TypeOf函数的参数必须是Type 而不是string。在 Go 中,是否可以通过 Reflect 包仅使用其完全限定名称来实例化结构体?
我使用下面的代码得到以下错误.
expected constructor, destructor, or type conversion before '=' token
Run Code Online (Sandbox Code Playgroud)
-
#include <string>
#include <map>
class Foo {
};
std::map<std::string, Foo> map;
map["bar"] = Foo();
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud) 就在我认为我开始理解基础知识的时候,我找到了一些让我回到现实的东西.在这种情况下,键入引用.
我找到了一个类似的例子:
class Worker
{
Boss boss;
public void Advise(Boss pBoss)
{
this.boss = pBoss;
}
Run Code Online (Sandbox Code Playgroud)
如果Boss类中的方法不是静态的而不是实例化的,那么如何引用它们?
我想我真正的问题是什么区别:
Boss boss;
Run Code Online (Sandbox Code Playgroud)
和
Boss boss = new Boss();
Run Code Online (Sandbox Code Playgroud) 我正在创建一个databasehelper类,其中包含访问SQLCE数据库的方法.我想使用相同的方法使用包含与不同表中的字段匹配的属性的不同类来读取行.要使用的类是在运行时确定的,我想将包含类中对象的列表传递给方法,并获取属性名并使用它们来读取数据库.会非常方便,因为我可以将它用于我的所有(SQLCE-)数据库.
(我更新了错误的代码以便在这里提供解决方案)
#region ReadData
///----------------------------------------------------------------------
/// <summary>
/// Reads datarows from database and adds them to list.
/// </summary>
/// <param name="data">List containing objects with properties.</param>
/// <param name="table">Table in database.</param>
/// <param name="search">Substring of SQL-statement that follows 'WHERE'.</param>
/// <param name="connect">Connectionstring.</param>
/// <returns>true if successfull</returns>
///----------------------------------------------------------------------
public static bool ReadData<T>(List<T> data, string table, string search, string connect) where T : class, new()
{
// Return if input id missing
if (data == null || table == "" || connect …Run Code Online (Sandbox Code Playgroud) 所以我试图创建一个使用泛型的类来扩展抽象类.防爆.
public abstract class Template<C extends Abstract>
Run Code Online (Sandbox Code Playgroud)
但是,我需要在我的课程中实例化这个'C'.我想我可能会这样做:
C s = (C) ((C)new Object()).getClass().getConstructor(Known.class,AnotherKnown.class).newInstance(objectOfKnownType,objectOfAnotherKnownType);
Run Code Online (Sandbox Code Playgroud)
所以我的问题基本上是否可行.我觉得这样
((C) new Object()).getClass()
Run Code Online (Sandbox Code Playgroud)
可能会给我一些问题.
如果我将其更改为:
C a;
C s = (C) (a.getClass().getConstructor( ... ).newInstance( ... ));
Run Code Online (Sandbox Code Playgroud) 对于C++学习的目的,我有文件class1.h,class1.cpp,class2.h和class2.cpp.我想实例化一个名为class1Objinside 的对象class2.我在哪里以及如何实例化此对象?我classObj在class2构造函数中实例化吗?
在过去,我已经创建了一个指向类的指针,该指针在那个时候运行良好,但我认为指针不是我这次应该采用的路径,因为它classObj只会在内部使用class2.
也许这很简单,但我没有使用Type它的类型和它的用途.
假设我想List<T>用T= Double或T= 创建一个UInt32,取决于某些函数的结果,比方说public static Type CheckType(String input);
在代码中:
Type t = Program.CheckType(someInput); // it returns typeof(Double) or typeof(UInt32)
if (t == typeof(Double))
List<Double> l = new List<Double>();
else
List<UInt32> l = new List<UInt32>();
Run Code Online (Sandbox Code Playgroud)
我知道上面的代码不会编译,因为我要让它l有两个不同的含义(一个double列表和一个unsigned int列表)......所以它引出了我的问题:
if上面的代码?与此类似的东西:
Type t = Program.CheckType(someInput);
List<t> l = new List<t>(); // I know this won't compile either...
Run Code Online (Sandbox Code Playgroud)
我的意思是,这通常会实例化一个通用List ...
先感谢您!
编辑:
这是不是重复的的 …
我想说的是:当你实例化一个类时,你可以.在对象之后使用access运算符()来使用该类的方法,但是如果你只想使用该类的一个方法而且只有一次?这个click事件(下面的代码)中的表达式可以工作,但这个方法被认为是一个好的/坏的编程实践吗?
private void button1_Click(object sender, EventArgs e)
{
new AboutBox1().ShowDialog();
}
Run Code Online (Sandbox Code Playgroud) 我有一个基本问题.考虑这个简单的代码:
class A{
void someMethod(){
B b = new B(); // Line 3
B c = new B(); // Line 4
}
}
Run Code Online (Sandbox Code Playgroud)
当执行第3行时,将类B加载到内存中(即:我们为类型为'Class'的对象分配物理空间(假设使用id - classLaoder1.B),类型包含类B的代码).
问题1#接下来会发生什么? - B类(占B的状态)的实例被创建基于该classLoader.B实际上包含B的信息的事实(已分配的物理内存)?
问题2#另外,在第-4行,由于classLoader.B存在于内存中,因此在内存中创建了一个包含c状态的对象?
我得到RuntimeException
枚举类型可能无法实例化
我不知道为什么.我想要的是用一个整数值来标识一年,就像我有9所以其他方法的年份是2006年.代码:
public class P21Make {
enum Catalog {
year2005(9),year2006(12),year2007(15),year2008(18),
year2009(21),year2010(23),year2011(25),year2012(28),
year2013(31),year2014(33),year2015(36),year2016(39),
year2017(42),year2018(45),year2019(48),year2020(51);
private int id;
Catalog(int c){
this.id=c;
}
}
public P21Make() {
Catalog c = new Catalog(9); // The Exception
}
}
Run Code Online (Sandbox Code Playgroud) instantiation ×10
c# ×4
java ×3
c++ ×2
generics ×2
casting ×1
classloader ×1
enums ×1
go ×1
list ×1
methods ×1
object ×1
oop ×1
propertyinfo ×1
reflect ×1