我有5年的经验。但老实说,虽然我知道并使用这个结构......
Baseclass bc = new DerivedClass();
我不知道它实际上做了什么,不是真的,不是真的。它是派生类还是基类?而且我知道如果我调用 bc.Method() 我将获得派生类方法。但只有当我使用新关键字或覆盖或其他东西时。老实说,我在这里开始有点模糊,我想我需要回到基础,有人能指出我正确的方向吗?
我有5年的经验。但老实说,虽然我知道并使用这个结构......
Baseclass bc = new DerivedClass();
我不知道它实际上做了什么,不是真的,不是真的。它是派生类还是基类?而且我知道如果我调用 bc.Method() 我将获得派生类方法。但只有当我使用新关键字或覆盖或其他东西时。老实说,我在这里开始有点模糊,我想我需要回到基础,有人能指出我正确的方向吗?
您正在创建 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 版本(它在编译时链接)。
使用以下
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();
}
它只是创建一个实例DerivedClass
并将其分配给类型为 BaseClass 的 bc