如何在分配给基对象时保持已分配的对象属性

本文关键字:分配 对象 属性 | 更新日期: 2023-09-27 18:11:36

好的,我有另一个问题…当你把基对象赋值为另一个对象时,基对象变成了那个对象,但仍然没有它的属性。

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()",因为Begin最初不存在于MyBaseObject中。我正在做一种类似Ruby的自定义语言到c#之间的转换(如上所述),但是这种类似Ruby的语言不会遇到我遇到的这个"问题"。它似乎在编译它。在。net 4中有什么东西可以解决我忘记的这个问题吗?

如何在分配给基对象时保持已分配的对象属性

嗯,你可以直接使用动态类型:

dynamic myObject;

…但是你的Mymethod方法不能真的接受MyObjectBase的任何实例…例如,it 必须Begin方法。使用动态类型,只有在执行时才会发现情况并非如此。

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

试一下。问题是,您使用的基类不提供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的范围。当您希望派生类访问基类中的某些内容时,可以使用Protected,但在处理派生类时不一定要使用这个作用域。Begin可以从基类和派生类外部访问,所以它需要是public的。

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" 
    }
}