在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

回到顶部