0

好的,我带着另一个问题回来了...当您将基础对象分配为另一个对象时,基础对象似乎变成了该对象,但仍然没有它的属性,例如。

public class MyObjectBase {
        public void Begin() {

    }

{
public class OneOfMyObjects : MyObjectBase {
       public void Begin() {
       base.Begin();

   //do stuff

} 
} 
public class ManagmentClass {

public MyObjectBase myCurrentObject;

//called a only one when the program starts
public void Start() {
     Mymethod(new OneOfMyObjects()); 

}
//generic method 
public void Mymethod<T>(T Objectclass) where T : MyObjectBase {
        myObject = Objectclass
        myObject.Begin(); // compiler error, non existent in MyObjectBase 
        myObject.GetType().ToString() //returns "OneOfMyObjects" 

}
}

当然,编译器找不到“Begin()”,因为在 MyBaseObject 中最初并不存在 begin。我正在将类似于 Ruby 的自定义语言转换为 C#(上图),但是这种类似 Ruby 的语言并没有遇到我遇到的这个“问题”。它似乎编译它。.NET4 中有什么东西可以解决我忘记的这个问题吗?

4

2 回答 2

2

好吧,你可以只使用动态类型:

dynamic myObject;

...但是您的Mymethod方法不能真正接受 a MyObjectBase... 的任何实例,例如,它必须有一个Begin方法。使用动态类型,您只会在执行时发现情况并非如此。

与其直接移植为具有不同习语的不同语言编写的一些代码,不如考虑代码试图实现的更高层次的目标,以及在 C# 中实现相同目标的最惯用的方法。如果没有更多信息,我们无法指导您。

于 2013-05-01T14:18:31.867 回答
1

试一试。问题是您使用的基类不提供 Begin 的定义(您知道,只是重申一下)。因此,要做的就是为基类提供一种方法,使其具有 Begin() 方法。在下面的示例中,MyObjectBase 是一个抽象类,而 Begin() 是一个抽象方法。这意味着 MyObjectBase 永远不会有 Begin() 的定义,但它会强制所有派生类提供 Begin() 的定义。因此,例如:

MyObjectBase obj1 = new MyObjectBase();
obj1.Begin(); //Won't Compile

OneOfMyObjects obj2 = new OneOfMyObjects();
obj2.Begin(); //Compiles if and only if OneOfMyObjects 
//class has a definition for Begin().

另外,我通常用 C++ 编程,所以这可能不是 C# 的 100% 最佳实践,但它是可编译的。我还更改了 Begin 的范围。当您希望派生类访问基类中的某些内容时使用受保护的,但它不一定是您在处理派生的某些内容时使用的范围。Begin 是从基类和派生类外部访问的,因此它需要是公共的。

public abstract class MyObjectBase
{
    public abstract void Begin();
}

public class OneOfMyObjects : MyObjectBase
{
    public override void Begin()
    {

        //do stuff

    }
}
public class ManagmentClass
{

    public MyObjectBase myCurrentObject;

    //called a only one when the program starts
    public void Start()
    {
        Mymethod(new OneOfMyObjects());

    }
    //generic method 
    public void Mymethod<T>(T Objectclass) where T : MyObjectBase {
    MyObjectBase myObject = Objectclass;
    myObject.Begin(); // Shouldn't throw an error any more
    myObject.GetType().ToString(); //returns "OneOfMyObjects" 

    }
}
于 2013-05-01T14:43:05.660 回答