1

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

Baseclass bc = new DerivedClass(); 

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

4

4 回答 4

4

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

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

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

于 2012-05-24T09:36:15.870 回答
2

它创建一个实例DerivedClass并将其隐式转换为 type Baseclass

正如我假设的那样编译它意味着要么DerivedClass继承自Baseclass,例如:

class DerivedClass : Baseclass
{
}

或者有一个隐式转换运算符用于在这些类型之间进行转换,例如

class DerivedClass
{
    public static implicit operator Baseclass(DerivedClass d)
    {
        // return a Baseclass here
    }
}
于 2012-05-24T09:26:46.180 回答
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,这意味着我们将无法访问 中的任何方法或属性EmployeeEmployee我想如果 的构造函数影响 的构造函数,这可能很有用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();
}
于 2012-05-24T09:33:24.440 回答
0

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

于 2012-05-24T09:26:26.977 回答