如何在分配给基对象时保持已分配的对象属性
本文关键字:分配 对象 属性 | 更新日期: 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"
}
}