English 中文(简体)
为何要给一个变量指定一个从衍生的类别实例, 而该变量不是类型,而是其基类
原标题:Why to assign an instance of a derived class to a variable which Type is not the one of the instance, but its base class

我有5年的经验,但说实话,我知道并使用这个构思...

Baseclass bc = new DerivedClass(); 

我不知道它实际上会做什么,不是真的,不是真的。它是衍生的类还是基础类?我知道如果我叫Bc.Method(),我会得到衍生的类方法。但是,只有当我使用新的关键词或超文本或其它东西时,我才会知道。说实话,我在这里开始变得有点模糊,我认为我需要用这个回到基本方面,有人能指向我正确的方向吗?

最佳回答

您正在创建一个“ 衍生” 实例, 并将其分配到一个 BasicClass 类型的变量中。 如果您有类似底等类的动物, 包括两个衍生的鱼类和狗类, 这可能有用, 但是您不知道其中哪一个将被即时引用, 这在您的上下文中并不重要, 因为您要引用一个在底等中定义的方法 。 例如, 您可以有类似的方法 :

Animal a;
if (whatever you want)
    a = new Dog();
else
    a = new Fish();
a.Feed();

使用修饰剂要小心, 因为如果您用虚拟定义动物喂养, 并用虚拟定义它, 在鱼体内重新定义它, 则将执行 Fish 版本( 它在执行时被链接 ) 。 如果您不将基版标为虚拟版本, 并将Fish 版本标为新版本, 则执行动物版本( 它在编译时被链接 ) 。

问题回答

它创造了一个 DerivedClass 的例子,“http://msdn.microsoft.com/en-us/library/ms173105%28v=vs.100%29.aspx" rel=“nofollow” >, 暗中投放 键入 Base类

正如我所假设的,这汇编了它的意思,即从DerivedClass 继承的Baseclas ,例如:

class DerivedClass : Baseclass
{
}

或者有",http://msdn.microsoft.com/en-us/library/z5z9kes2%28v=vs.100%29.aspx" rel=“nofollow” >imclic caulter ,用于在这些类型之间铸造,例如:

class DerivedClass
{
    public static implicit operator Baseclass(DerivedClass d)
    {
        // return a Baseclass here
    }
}

使用以下

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Employee : Person
{
    public string RoleName { get; set; }
}

如果我们创建一个新的 Employee 实例,但事实上我们的变量声明是 Person , 将发生的一切都是隐含的投影到 Person , 意思是说我们不会接触 Employee 中的任何方法或属性。我想,如果Eployee 的构建者影响Person 的构建者,但不管在Employee 中,我们不关心任何事情,但我建议不这样做。相反,我建议构建一种方法,使用更清晰的多元形态。这就是当衍生的物体被用作参数时,如果事实上参数类型是其基底之一,例如当参数类型被使用时,这可能是有用的。

public void DoSomething(Employee employee)
{
    // here we do something with an employee
    // ...

    string fullName = GetTheirFullName(employee);
}

public string GetTheirFullName(Person person)
{
    return (person.FirstName + " " + person.LastName).Trim();
}

它只是创建一个 DerivedClass 实例, 并将其指定为 bc, 即属于 BaseClass 类型 。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签