Bor*_*ski 3 c# polymorphism overloading
在上面的代码段我有一个基类形状,并从它两个派生的类Rectangle和Triangle。我实例化了它们,但是对于一个Triangle对象,我使用其基类的引用类型。
因此,现在当我调用一个方法时calculate(),它将更喜欢调用采用基类参数的方法。
这样做的目的是什么?
我创建的Triangle对象不是Shape对象,我只是使用基类的引用。我的另一个问题是,与使用基类的引用和从派生实例化对象而不是使用派生引用相比,它们还有其他区别吗?
public static void Main(string[] args)
{
Point tc = new Point(3, 4);
Point rc = new Point(7, 5);
Shape shape = new Triangle(tc, 4, 4, 4);
calculate(shape);
}
public static void calculate(Shape shape) <<-- new Triangle() with base class ref will came here.
{
Console.WriteLine("shape");
}
public static void calculate(Rectangle rectangle)
{
Console.WriteLine("rectangle");
}
public static void calculate(Triangle triangle) <<-- new Triangle() using triangle ref will came here.
{
Console.WriteLine("triangle");
}
Run Code Online (Sandbox Code Playgroud)
1ST问题:现在,当我调用方法calculate()时,它将更喜欢调用采用基类参数的方法。这样做的目的是什么?
答:怎么可能是其他方式?编译器将无法确定对象的“实际”类型,因为只有在运行时才能真正知道该类型。使用“ reflection”(例如GetType()和typeof())将父对象(形状)转换为其子对象(三角形),然后将其作为参数传递,这是您的责任。如果它以其他任何方式起作用,则您将无法正确实现以下方法。
public foo(object var1){
// Test for var1's type and perform a operation
}
Run Code Online (Sandbox Code Playgroud)
第二个问题:与使用基类的引用和从派生实例化对象而不是使用派生引用相比,它们还有其他区别吗?
答:在没有内存的情况下,引用始终指向相同的数据,但是上下文将更改。这意味着该对象所确定的对象类型(子对象或父对象)决定了可以访问哪些字段/方法。对象强制转换为哪种类型不会改变实际存储在堆中的内容,而是会更改您可以访问的内容。下面的代码段对此进行了演示。
public class Parent {
public int var1 = 1;
}
public class Child : Parent {
public int var2 = 2;
}
public void foo () {
Parent theObject = new Child();
int num1 = theObject.var1; // Valid
int num2 = theObject.var2; // Invalid
int num3 = ((Child)theObject).var2; // Valid
}
Run Code Online (Sandbox Code Playgroud)