2012-03-02 1957 views
1

那么,因为我从手机输入这个我不能键入或复制粘贴整个代码,因此我连接到SO后 - - >What is the error in this code? Interview在c#oop如何解释为什么基类可以采取派生类实例

如果你这样做 X a = new Y();它编译为 。一位采访者问这怎么可能?我知道如果X被定义为抽象类,这将是可能的,但事实并非如此。

+0

为什么不能编译?你的问题是“什么是继承”? – 2012-03-02 01:47:23

+0

@chris基类和派生类可以拥有自己独特且不同的方法/属性/字段定义。所以从逻辑上说,这个陈述不应该被编译......但是它确实......我不知道它背后的原因 – deostroll 2012-03-02 01:53:43

+0

如果你不了解继承,你需要阅读一本编程手册,一篇文章或者一篇博文继承。真正为C++,Java,C#等编写的任何东西都适用于这个例子。 – 2012-03-02 02:00:03

回答

1

要扩大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类型的引用。

回顾一下:因为基类的每个成员也都是派生类的成员,所以可以使用派生类的实例,就好像它是基类的实例一样。派生类实例具有基类的所有成员。

您提出了抽象类的主题。当然,抽象类不能被实例化;你只能实例化一个从抽象类派生的类。然而,这并不影响替代原则,除了暗示变量的类型是抽象类必须指的是派生类型的实例,而类型为非抽象(非密封)类的变量可能是指派生类型的一个实例。

4

如果Y继承X,那么Y是一种 X,并且可以在X可以使用的任何地方使用。

无论X是否抽象,这都会起作用。

1

类Y要么继承类X,要么X是Y继承的接口。

但是如果有人在求职面试中问我,我会告诉他们,我不想在开发人员创建具有单个字符名称的类型的任何地方工作。

-1

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

+2

这与协方差无关,它只是基本的遗传/多态性 – BrokenGlass 2012-03-02 02:13:22

0

让我们假设

class Animal 
{ 

} 

class Tiger:Animal 
{ 

} 

Animal fooAnimal = new Tiger() 

这是可能的,因为Tiger是一种类型的Animal

相关问题