这个
有什么区别DerivedClass classinst = new DerivedClass();
和
BaseClass classinst = new DerivedClass();
我似乎没有看到任何差异,编译器也没有抱怨,所以我可以互换使用吗?
答案 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();