关于从继承类实例化一个类

时间:2014-03-24 15:10:30

标签: c# class inheritance polymorphism

这个

有什么区别
DerivedClass classinst = new DerivedClass();

BaseClass classinst = new DerivedClass();

我似乎没有看到任何差异,编译器也没有抱怨,所以我可以互换使用吗?

7 个答案:

答案 0 :(得分:2)

两者之间的唯一区别是,如果你这样做

DerivedClass classinst = new DerivedClass();

编译器 classinst解释为DerivedClass,并允许您使用在派生类中声明的所有特定方法/属性/等,而不是基类。

另一方面,如果你这样做 BaseClass classinst = new DerivedClass();

编译器会将classinst解释为BaseClass,您将无法访问这些成员。

确实意识到对象的实际类型不会改变。无论您使用哪两个声明,对该对象的引用都保持不变。唯一改变的是参考是如何解释,因此成员可用;基类或派生类的那些。

答案 1 :(得分:1)

在第二个示例中,您无法访问DrivedClass的方法或属性,因为您的变量定义为BaseClass。即使DrivedClass的实例在幕后,您也无法访问特定于该类型的成员。

答案 2 :(得分:0)

嗯,对于第二个版本,您将无法使用您的实例访问特定于Derived类的属性/方法(不会转换为派生类型)。

想象

public class Animal {
  public int NbOfEyes {get;set;}
}

public class Dog : Animal {
  public bool IsPolite {get;set;}
}

Animal dog = new Dog();

dog.IsPolite = false; //you can't do that. dog is an animal, it doesn't know it can be polite.
dog.NbOfEyes = 2;//you can do that, you have access to animal's properties /methods

Dog dog2 = new Dog();
dog2.IsPolite = false; // you can do that.
dog2.NbOfEyes = 4; //you can also do that, you have access to base class's properties / methods.

答案 3 :(得分:0)

使用:

BaseClass classinst = new DrivedClass();

你允许你自己也做:

BaseClass classinst = new DrivedClassOne();
BaseClass classinst = new DrivedClassTwo();

在一个可以说你有道路对象的情况下,这可能会很好,其中包含一个汽车列表。然后你可以在列表中添加一个新福特或新本田,因为它是汽车类型,而不仅仅是福特或本田

答案 4 :(得分:0)

区别在于" classinst"变量

请尝试以下代码:

string typename = typeof(classinst).ToString();

答案 5 :(得分:0)

如果要使用多态行为 - 即在基类中定义的方法根据在派生类中如何被覆盖而行为不同,但不需要知道派生类,则将其指定为基类。

这是典型的面向对象行为 - 如果您为此目的使用子类,它们几乎总是被称为基类(或者更常见的是这些天作为多个相关类实现的接口)。

答案 6 :(得分:0)

面向对象编程中最重要的两个原则是继承多态

继承允许创建一个继承现有类的数据和行为的类。然后,子类可以专门化(通常通过覆盖)超类行为。

多态性允许子类的行为就像它的超类一样,因此在您的情况下,DerivedClass的实例可以在需要BaseClass的实例的任何地方使用。

因此可以将DerivedClass的实例分配给类型为BaseClass的变量(由于多态性)。但即使分配给BaseClass类型的变量,它也会像DerivedClass的实例一样,因此将自动使用任何覆盖行为。

示例:

class BaseClass
{
    public virtual void ShowMe()
    {
        Console.WriteLine("I'm the base class");
    }
}

class DerivedClass : BaseClass
{
    public override void ShowMe() 
    {
        Console.WriteLine("I'm the derived class");
    }
}

// This will print "I'm the base class"
BaseClass baseClass = new BaseClass();
baseClass.ShowMe(); 

// This will print "I'm the derived class"
DerivedClass derivedClass = new DerivedClass();
derivedClass.ShowMe(); 

// This will print "I'm the derived class"
// Reason: even if assigned to a BaseClass variable,
// it's still a DerivedClass instance
BaseClass baseClass2 = new DerivedClass();
baseClass2.ShowMe(); 

// This will generate a compiler error
// Subclasses can behave like superclasses,
// but the opposite is not possible
DerivedClass derivedClass2 = new BaseClass();