使用覆盖初始化对象

本文关键字:对象 初始化 覆盖 | 更新日期: 2023-09-27 17:59:38

是否可以用一些等效的替代新运算符来初始化对象?

假设我有某个对象,并且我想将其强制转换为某个派生类型。让我们称它们为objBase和objDerived。

因此,假设这个objDerived类型有一个方法,它在objBase方法上使用了新的修饰符,但我想将新方法与我的强制转换objBase对象一起使用。有没有类似于的说法

objBase myObjB = new objBase();
myObjB = *override* objDervied();

也许想要这样做毫无意义,或者我错过了一些非常简单的选择?我敢肯定,一些人为的例子可能会显示出一些有用的时间。。。实际上我不需要这么做,但自从我了解到方法中的新修饰符关键字后的最后几天,我只是想知道它。

使用覆盖初始化对象

在这种情况下,不需要重写。您总是可以将派生对象引用直接分配给基类变量:

objBase myObjB = new objDerived();

请注意,创建一个实例,然后立即重新分配也是不好的做法:

// Don't instantiate an object in the first line here, 
// since you're going to assign it in the next line
objBase myObjB;  //= new objBase();
myObjB = new objDervied();

关于:

因此,假设这个objDerived类型有一个方法,它在objBase方法上使用了新的修饰符,但我想将新方法与我的强制转换objBase对象一起使用。

您只能调用new方法,该方法通过分配或强制转换回派生类来隐藏基类方法:

objBase myObjB = new objDerived();
((objDerived)myObjB).Method(); // Will call objDerived.Method

如果myObjB实际上没有引用objDerived实例,那么这将在运行时失败。

这里的另一个选项是使用dynamic。对变量使用dynamic将导致发生动态调度,这将使变量有效地表现为始终是"最派生"的类型,并调用新方法。这实际上很有用,因为您可以在C#中有效地进行多次调度,即使它通常是静态类型的。这是一个完整的工作样本:

void Main()
{
    Base b = new Derived();  
    dynamic d = b;
    Console.WriteLine(d.Output());//This prints "Derived"
}
public class Base {
public string Output() {
        return "Base";
}
}
public class Derived:  Base {
    public new string Output() {
        return "Derived";
}
}
objBase myObjB = new objDervied();

因此,假设这个objDerived类型有一个使用新修饰符的方法在objBase方法上,但我想在强制转换中使用新方法objBase对象

我想你想要的是这样的东西:

public class Base {
   public string Write() {
        return "Base";
   }
}
public class Derived:  Base {
    public new string Write() { //HIDES BASE CLASS METHOD
        return "Derived";
   }
}

void Main()
{
    Base b = new Derived();  
    b.Write();//THIS WILL RETURN "BASE"
    Derived d = new Derived();  
    d.Write();//THIS WILL RETURN "DERIVED"
}

您不能执行此操作,因为派生类成员上的new仅覆盖具体对象类型。

要以您希望的方式工作,所以只使用基类型,您需要使用基本的OOP概念,如inheritancevirtual/absrtact方法。

没门!

在运行时不能覆盖成员。

这将是动态语言的一个特性,而不是像C#这样的静态类型和编译语言。例如,您可以在JavaScript中这样做,因为您可以在运行时重用标识符:

var someJsObject = { myMethod: function() { } };
someJsObject.myMethod = function() { alert("hey, I did it!"); };

顺便说一句,我觉得这不是一个好的实践,因为一件事是拥有一种动态语言(duck-typeing),另一件事就是";嘿,我是只鸭子,我过去常说"嘎嘎",但现在我是只会叫的鸭子&";。这很可悲。

更新

事实上,你可以用C#和ExpandoObject:做这样的事情

dynamic expando = new ExpandoObject();
expando.MyMethod = new Func<bool>(() => true);
dynamic expando2 = new ExpandoObject();
expando.MyMethod = new Func<string>(() => "What? I've changed!");
expando.MyMethod = expando2.MyMethod;
            
// This will set "What? I've changed!"
string result = expando.MyMethod();

但这仍然是一种糟糕的做法。