我有5年的经验。但说实话,我知道并使用这个结构...
Baseclass bc = new DerivedClass();
我不知道它究竟做了什么,不是真的,不是真的。它是派生类还是基类?我知道如果我调用bc.Method(),我将得到派生类方法。但只有当我使用new关键字或覆盖或其他东西时。说实话,我在这里开始有点模糊,我想我需要回到基础这个,有人能指出我正确的方向吗?
答案 0 :(得分:2)
它会创建一个DerivedClass
和implicitly 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