声明对象,初始化为不同的类型
本文关键字:类型 对象 初始化 声明 | 更新日期: 2023-09-27 18:04:11
是否有一种方法可以声明一个全局对象,然后根据用户输入将该对象初始化为特定类型?
如我所得到的:
class Program{
public myObject; // Trying to declare this globally
public static object myObject; //Also tried
public object myObject; //Also tried with no luck on any
static void getMode(string userInput){
switch(userInput){
case "a": myObject= new ClassA(); break;
case "b": myObject= new ClassB(); break;
default: myObject= new ClassC(); break;
}
Console.WriteLine(myObject.getObjectString);
}
static void getInt(){
Console.WriteLine(myObject.getInt.toString());
}
//More methods and stuff etc
}
例如,每个类A、B和C都有相同的方法。
然而,我得到的错误是'myObject'不包含getObjectString和getInt的定义。还为
获得'no extension method'对象本身做一些奇怪的事情,但简化了:
public class ClassA{
public string getObjectString{
get{
string retVal = "Class A string";
return retVal;
}
}
public int32 getInt{
get{
int32 retVal = 42;
return retVal;
}
}
}
public class ClassB{
public string getObjectString{
get{
string retVal = "Class B string";
return retVal;
}
}
public int32 getInt{
get{
int32 retVal = 7;
return retVal;
}
}
}
我浏览了一下Convert类,但是我找不到任何有用的东西。也许我看错方向了?
可以使用interface
public interface MyInterface
{
public string getObjectString{get;}
public int32 getInt{get;}
}
然后使ClassA
和ClassB
像这样实现MyInterface
public class ClassA : MyInterface{ ...
然后这样使用
public MyInterface myObject;
static void getMode(string userInput){
switch(userInput){
case "a": myObject= new ClassA(); break;
case "b": myObject= new ClassB(); break;
default: myObject= new ClassC(); break;
}
您还可以考虑继承。
您还可以返回一个对象检查并从返回方法中强制转换返回值
static object GetMode(string userinput) {
if (string.IsNullOrEmpty(userinput)) {
// use try catch in main method
throw new ArgumentException("Expected a value in the userinput");
// OR
return new ClassC();
}
userinput = userinput.toLower();
if (string.Equals("a")) {
return new ClassA();
} else if (string.Equals("b")) {
return new ClassB();
}
return new ClassC();
}
和主方法
var obj = GetMode(userinput);
if (obj is ClassA) {
var classA = obj as ClassA;
// do something with classA
return;
}
if (obj is ClassB) {
var classB = obj as ClassB;
// do something with classB
return;
}
if (obj is ClassC) {
var classC = obj as ClassC;
// do something with classC
return;
}