为什么要将派生类的实例分配给一个变量,该变量的Type不是实例的一个,而是它的基类

时间:2012-05-24 09:22:21

标签: c# polymorphism

我有5年的经验。但说实话,我知道并使用这个结构...

Baseclass bc = new DerivedClass(); 

我不知道它究竟做了什么,不是真的,不是真的。它是派生类还是基类?我知道如果我调用bc.Method(),我将得到派生类方法。但只有当我使用new关键字或覆盖或其他东西时。说实话,我在这里开始有点模糊,我想我需要回到基础这个,有人能指出我正确的方向吗?

4 个答案:

答案 0 :(得分:2)

它会创建一个DerivedClassimplicitly casts的实例来输入Baseclass

我认为这会编译它意味着DerivedClass继承自Baseclass,例如:

class DerivedClass : Baseclass
{
}

或者在这些类型之间有一个implicit cast operator用于投射,例如

class DerivedClass
{
    public static implicit operator Baseclass(DerivedClass d)
    {
        // return a Baseclass here
    }
}

答案 1 :(得分:2)

您正在创建DerivedClass的实例并将其分配给BaseClass类型的变量。如果你有类似基类Animal的东西,它有两个派生类Fish和Dog,但你不知道哪一个将被实例化,这在你的上下文中并不重要,因为你要调用一个定义的方法在基类中。例如,你可以这样:

Animal a;
if (whatever you want)
    a = new Dog();
else
    a = new Fish();
a.Feed();

使用修饰符要小心,因为如果您使用虚拟动画定义Feed in Animal并在Fish中重新定义它,则会执行Fish版本(它在执行时链接)。如果您没有将基本版本标记为虚拟版本并将Fish版本标记为新版本,则会执行Animal版本(它在编译时链接)。

答案 2 :(得分:1)

使用以下

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Employee : Person
{
    public string RoleName { get; set; }
}

如果我们创建一个Employee的新实例,但我们的变量声明实际上是Person,那么所有这一切都会隐式转换为Person,这意味着我们不会访问Employee中的任何方法或属性。我认为如果Employee的构造函数影响Person的构造函数,这可能很有用,但我们不关心Employee中的任何内容,但我不推荐它。相反,我建议构建一个利用更清晰的多态性的方法。这是当派生对象用作参数时,实际上参数类型是其基础之一,例如。

public void DoSomething(Employee employee)
{
    // here we do something with an employee
    // ...

    string fullName = GetTheirFullName(employee);
}

public string GetTheirFullName(Person person)
{
    return (person.FirstName + " " + person.LastName).Trim();
}

答案 3 :(得分:0)

它只是创建一个DerivedClass的实例并将其分配给bc,其类型为BaseClass