Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 为什么VB不允许从父类到子类的类型转换?_Class_Inheritance_Type Conversion - Fatal编程技术网

Class 为什么VB不允许从父类到子类的类型转换?

Class 为什么VB不允许从父类到子类的类型转换?,class,inheritance,type-conversion,Class,Inheritance,Type Conversion,我已经问了一个问题,我基本上需要将基类的实例转换为子类(或者使用基类属性的实例创建子类的新实例)。结论似乎是最好的方法是手动分配我需要在基类的构造函数中传输的每个属性 虽然这在某些情况下是可行的,但当有许多属性要传输时,或者当基类要更改时,这肯定不是可行的-每次向基类添加属性时,构造函数也需要更改,因此这种解决方案是不雅观的 我在网上搜索过,看不出为什么没有实现这种类型转换的任何原因。到目前为止,我所看到的论点将此操作描述为“毫无意义”(我看到的一个类比是从汽车中制造一辆小型货车),质疑如何处理

我已经问了一个问题,我基本上需要将基类的实例转换为子类(或者使用基类属性的实例创建子类的新实例)。结论似乎是最好的方法是手动分配我需要在基类的构造函数中传输的每个属性

虽然这在某些情况下是可行的,但当有许多属性要传输时,或者当基类要更改时,这肯定不是可行的-每次向基类添加属性时,构造函数也需要更改,因此这种解决方案是不雅观的

我在网上搜索过,看不出为什么没有实现这种类型转换的任何原因。到目前为止,我所看到的论点将此操作描述为“毫无意义”(我看到的一个类比是从汽车中制造一辆小型货车),质疑如何处理子类中的非继承变量,或者声称必须有更好的解决方案来解决试图实现的问题

就我所见,只要操作有用,它就不需要“有意义”,所以这不是一个很好的理由。添加几个属性(可能还有方法/重写它们)将实例更改为子类有什么错?在非继承变量的情况下,只需允许这种类型转换即可解决此问题,只需将构造函数添加到子类中,或者只需将其设置为默认值即可。毕竟,构造函数通常调用
MyBase.New(…)
。使用基的构造函数(本质上是创建基的新实例)和使用已初始化的实例之间有什么区别?最后,我不认为第三种观点是合理的——有时所有其他的解决方案都不雅观

那么最后,有没有其他的理由来解释为什么这种铸造是不被允许的,有没有一种优雅的方法来避免这种情况

编辑:

由于我对这个话题了解不多,我想我的意思是说“转换”而不是“转换”。我还将添加一个示例来说明我正在努力取得的成功。只有在初始化子类时才允许转换:

Class BaseClass

Dim x as Integer
Dim y as Integer

End Class


Class Subclass1 : Inherits BaseClass

    Dim z as Integer

    Sub New(Byval value As Integer)
        'Standard initialisation method

        MyBase.New()

        z = value
    End Sub

    Sub New(Byval value As Integer, Byval baseInstance As BaseClass)
        'Type conversion from base class to subclass

        baseInstance.passAllproperties()
'This assigns all properties of baseInstance belonging to BaseClass to Me.
'Properties not in BaseClass (eg. if baseInstance is Subclass2) are ignored.

        z = value
    End Sub
End Class


Class Subclass2 : Inherits BaseClass

    Dim v As Integer
End Class

你描述的不是演员。你有没有听过“用不同的眼光看待事物”这句话?意思是用不同的方式看同一件事,或者让同一件事看起来不同。这正是术语“cast”在编程中使用的方式。强制转换时,不会更改对象的类型,而只更改用于访问对象的引用的类型。如果要从基类型强制转换为派生类型,则所引用的对象实际上必须是该派生类型。如果不是,那么你不是在执行演员阵容,而是在进行转换


那么,为什么不能将基类型的实例转换为派生类型的实例呢。那么,你为什么能这么做呢?是的,这可能会节省编写一些代码的时间,但它真的有意义吗?假设您有一个具有一个属性的基类型和一个添加另一个属性的派生类型。我们还假设该派生类型具有要求您为第二个属性提供值的构造函数。您的意思是,该语言应该为您提供一种将基类的实例神奇地转换为派生类的实例的方法,这意味着它必须降低您绕过作者通过构造函数定义的规则的速度。为什么这是件好事?

你所描述的不是演员。你有没有听过“用不同的眼光看待事物”这句话?意思是用不同的方式看同一件事,或者让同一件事看起来不同。这正是术语“cast”在编程中使用的方式。强制转换时,不会更改对象的类型,而只更改用于访问对象的引用的类型。如果要从基类型强制转换为派生类型,则所引用的对象实际上必须是该派生类型。如果不是,那么你不是在执行演员阵容,而是在进行转换


那么,为什么不能将基类型的实例转换为派生类型的实例呢。那么,你为什么能这么做呢?是的,这可能会节省编写一些代码的时间,但它真的有意义吗?假设您有一个具有一个属性的基类型和一个添加另一个属性的派生类型。我们还假设该派生类型具有要求您为第二个属性提供值的构造函数。您的意思是,该语言应该为您提供一种将基类的实例神奇地转换为派生类的实例的方法,这意味着它必须降低您绕过作者通过构造函数定义的规则的速度。为什么这是件好事?

一般来说,因为:

Class TheBase
End Class

Class Derived1 : TheBase
    Sub Foo()
    End Sub
End Class

Class Derived2 : TheBase
    Sub Bar()
    End Sub
End Class

Sub Main()
    Dim myDerived1 As New Derived1
    ' cast derived to base
    Dim myTheBase = CType(myDerived1, TheBase) 
    ' cast base to derived?
    ' but myTheBase is actually a Derived1
    Dim myDerived2 As Derived2 = CType(myTheBase, Derived2)
    ' which function call would you like to succeed?
    myDerived2.Foo()
    myDerived2.Bar()
End Sub

一般来说,正因为如此:

Class TheBase
End Class

Class Derived1 : TheBase
    Sub Foo()
    End Sub
End Class

Class Derived2 : TheBase
    Sub Bar()
    End Sub
End Class

Sub Main()
    Dim myDerived1 As New Derived1
    ' cast derived to base
    Dim myTheBase = CType(myDerived1, TheBase) 
    ' cast base to derived?
    ' but myTheBase is actually a Derived1
    Dim myDerived2 As Derived2 = CType(myTheBase, Derived2)
    ' which function call would you like to succeed?
    myDerived2.Foo()
    myDerived2.Bar()
End Sub

使用
System.Reflection
迭代基类的属性和字段,并将它们应用于派生类。此示例包括一个公共属性和一个公共字段,但也适用于多个私有/受保护的属性和字段。您可以将整个示例粘贴到新的控制台应用程序中进行测试

导入系统反射
模块1
副标题()
Dim p作为新父级
p、 属性1=“abc”
p、 Field1=“def”
尺寸c=新子女(p)
Console.WriteLine(“Property1=”“{0}”,Field1=“{1}”,c.Property1,c.Field1)
Console.ReadLine()
端接头
班级家长
公共属性Property1为String=“未设置”
公共属性字段1为String=“未设置”
末级
班童
继承父项
公共子新建(myParent作为父级)
Dim fieldInfo=G