1

是否可以用一些等效于 override 来代替 new 运算符来初始化一个对象?

假设我有一些对象,我想将它转换为一些派生类型。让我们称它们为 objBase 和 objDerived。

所以假设这个 objDerived 类型有一个在 objBase 方法上使用 new 修饰符的方法,但我想将新方法与我的强制转换 objBase 对象一起使用。有什么方法可以说相当于:

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

也许想要这样做是没有意义的,或者我缺少一些非常简单的替代方案?我很确定一些人为的例子可能会显示它可能有用的一些时间......我实际上并不需要这样做,但我只是想知道它的最后几天,因为我了解了新的修饰符关键字方法。

4

4 回答 4

2

在这种情况下,无需覆盖。您始终可以直接将派生对象引用分配给基类变量:

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 方法上使用 new 修饰符的方法,但我想将新方法与我的强制转换 objBase 对象一起使用。

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

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

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

这里的另一个选择是使用dynamic. 使用dynamicfor 您的变量将导致发生动态调度,这将使变量有效地表现得好像它始终是“最衍生”的类型,并调用您的新方法。这实际上很有用,因为您可以在 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";
}
}
于 2013-02-14T16:44:29.877 回答
1

没门!

您不能在运行时覆盖成员。

这将是动态语言的更多功能,而不是像 C# 这样的静态类型和编译语言。例如,您可以在 JavaScript 中执行此操作,因为您可以在运行时重用标识符:

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

顺便说一句,我觉得这不是一个好习惯,因为一件事是使用动态语言(鸭子打字),另一件事是“嘿,我是鸭子,我曾经说嘎嘎嘎嘎,但现在我在吠叫鸭!”。这是可悲的。

更新

嗯......事实上,你可以使用 C# 和 an 来做这样的事情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();

但这仍然是一个不好的做法。

于 2013-02-14T16:46:01.237 回答
1

所以假设这个 objDerived 类型有一个在 objBase 方法上使用 new 修饰符的方法,但我想将新方法与我的 cast 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方法。

于 2013-02-14T16:48:37.623 回答
1
objBase myObjB = new objDervied();
于 2013-02-14T16:41:41.720 回答