在c#oop如何解释为什么基类可以采取派生类实例
那么,因为我从手机输入这个我不能键入或复制粘贴整个代码,因此我连接到SO后 - - >What is the error in this code? Interview在c#oop如何解释为什么基类可以采取派生类实例
如果你这样做 X a = new Y();它编译为 。一位采访者问这怎么可能?我知道如果X被定义为抽象类,这将是可能的,但事实并非如此。
回答:
要扩大BrankoDimitrijević的回答,这可能是因为Liskov substitution principle。
您的评论,你说
基类和派生类可以有自己的独特和不同的方法/属性/字段定义。所以在逻辑上,该声明不应该编译...但它确实...我不知道它背后的原理
确实,基类和派生类有它们自己的成员定义,但它们并非完全是截然不同。具体地说,基类的每个成员也是派生类的成员。例如,你可以总是说
object o = anything; Console.WriteLine(o.ToString());
Console.WriteLine(o.GetHashCode());
Console.WriteLine(o.GetType().Name);
你可以这样做,因为每个对象都有的ToString,GetHashCode的,和的GetType方法,因为每一个对象的运行时类型的对象继承直接或间接的影响。
你可以做同样的不是对象以外的基类:
class X {
public string Exclamation { get { return "Inherit this!"; } }
}
class Y : X
{
public string Question { get { return "What's up with that?"; } }
}
然后,它是完全合法的说
X x = new Y(); Console.WriteLine(x.Exclamation);
不过,当然,你不能说
X x = new Y(); Console.WriteLine(x.Question); //does not compile!
为了使用Question属性,您需要有一个Y类型的引用。
回顾一下:因为基类的每个成员也都是派生类的成员,所以可以使用派生类的实例,就好像它是基类的实例一样。派生类实例具有基类的所有成员。
您提出了抽象类的主题。当然,抽象类不能被实例化;你只能实例化一个从抽象类派生的类。然而,这并不影响替代原则,除了暗示变量的类型是抽象类必须指的是派生类型的实例,而类型为非抽象(非密封)类的变量可能是指派生类型的一个实例。
回答:
如果Y继承X,那么Y是一种 X,并且可以在X可以使用的任何地方使用。
无论X是否抽象,这都会起作用。
回答:
类Y要么继承类X,要么X是Y继承的接口。
但是如果有人在求职面试中问我,我会告诉他们,我不想在开发人员创建具有单个字符名称的类型的任何地方工作。
回答:
C#支持所谓的协变和逆变。协变是隐式地(没有任何额外的代码)在本例中将一个派生类(在这种情况下是Y)转换为基类(在这种情况下为X)的能力。这是可能的,因为Y扩展了X,这意味着Y具有与X 。这允许将X类型的变量分配给派生类。
这对于扩展类和重载非常重要。如果X类包含一个叫Foo的方法和派生类X创建了一个叫Foo的方法,即使它被转换为一个类型X.这里从Y中的方法将被称为是一个例子:
public class X {
public void Foo()
{
Console.WriteLine("Something");
}
}
public class Y : X // y derives from X
{
public override void Foo()
{
Console.WriteLine("Class Y");
}
}
public class Program
{
static void Main()
{
X item = new Y(); // covariance.
item.Foo(); // prints "Class Y"
}
}
希望这不是夸大,我不知道你的技能水平。来自MSDN的这篇文章解释了它是一个litten,http://msdn.microsoft.com/en-us/library/ee207183.aspx。
回答:
让我们假设
class Animal {
}
class Tiger:Animal
{
}
Animal fooAnimal = new Tiger()
这是可能的,因为Tiger
是一种类型的Animal
。
以上是 在c#oop如何解释为什么基类可以采取派生类实例 的全部内容, 来源链接: utcz.com/qa/266976.html