Asp.net 继承类以删除属性并更改方法逻辑

Asp.net 继承类以删除属性并更改方法逻辑,asp.net,vb.net,inheritance,Asp.net,Vb.net,Inheritance,以下类在ASP.NET应用程序中用于从数据库结果集中读取货币并将其相加(例如,以美元显示总计加上以GB磅显示总计)。其工作方式如下: 读取货币ID值 如果货币ID已存在,请增加该货币的总额 如果货币ID不存在,请将其与其值一起添加到列表中 下一个 它使用CurrencyID属性作为每个唯一货币之间的区分符,效果很好。然而,现在很明显,IsoCurrencySymbol在默认情况下对于每种货币也是唯一的,因此实际上不需要CurrencyID 所以。。。我想知道是否可以从此类继承并删除对Curren

以下类在ASP.NET应用程序中用于从数据库结果集中读取货币并将其相加(例如,以美元显示总计加上以GB磅显示总计)。其工作方式如下:

  • 读取货币ID值
  • 如果货币ID已存在,请增加该货币的总额
  • 如果货币ID不存在,请将其与其值一起添加到列表中
  • 下一个
  • 它使用
    CurrencyID
    属性作为每个唯一货币之间的区分符,效果很好。然而,现在很明显,
    IsoCurrencySymbol
    在默认情况下对于每种货币也是唯一的,因此实际上不需要
    CurrencyID

    所以。。。我想知道是否可以从此类继承并删除对
    CurrencyID
    的任何引用,从而使
    CompareTo
    方法改用
    IsoCurrencySymbol

    诀窍是保留广泛使用的现有类,但引入一个不需要
    CurrencyID
    的修改版本。请问可以这样做吗

    <Serializable()> _
    Public Class CurrencyCounter
    
        <Serializable()> _
        Private Class CurrencyType
            Implements IComparable
    
            Public IsoCurrencySymbol As String
            Public CurrencySymbol As String
            Public CurrencyID As Int16
            Public Amount As Decimal
    
            Public Function CompareTo(obj As Object) As Integer Implements System.IComparable.CompareTo
                If Not TypeOf (obj) Is CurrencyType Then
                    Throw New ArgumentException("Object is not a currency type")
                Else
                    Dim c2 As CurrencyType = CType(obj, CurrencyType)
                    Return Me.CurrencyID.CompareTo(c2.CurrencyID)
                End If
            End Function
    
        End Class
    
        Private _Currencies As List(Of CurrencyType)
    
        Public Sub New()
            _Currencies = New List(Of CurrencyType)
        End Sub
    
        Private Sub AddStructToList(CurrencyID As Integer, IsoCurrencySymbol As String, CurrencySymbol As String, Amount As Decimal)
            If IsoCurrencySymbol <> String.Empty AndAlso Amount > 0 Then
                Dim s As New CurrencyType
                s.CurrencyID = CurrencyID
                s.IsoCurrencySymbol = IsoCurrencySymbol
                s.CurrencySymbol = CurrencySymbol
                s.Amount = Amount
                _Currencies.Add(s)
            End If
        End Sub
    
        Public Sub Add(CurrencyID As Integer, IsoCurrencySymbol As String, CurrencySymbol As String, Amount As Decimal)
            Dim ct As CurrencyType = _Currencies.Find(Function(obj) obj.CurrencyID = CurrencyID)
            If ct IsNot Nothing Then
                ct.Amount += Amount
            Else
                AddStructToList(CurrencyID, IsoCurrencySymbol, CurrencySymbol, Amount)
            End If
        End Sub
    
        Public Sub Clear()
            _Currencies.Clear()
        End Sub
    
        Public Function Count() As Integer
            Return _Currencies.Count
        End Function
    
        Public Function RenderTotals() As String
            ' ...
        End Function
    
    End Class
    
    _
    公共类货币计数器
    _
    私有类CurrencyType
    实现不可比较
    公共等电流符号作为字符串
    作为字符串的公共货币符号
    公共货币ID为Int16
    以十进制表示的公共金额
    公共函数CompareTo(obj作为对象)作为整数实现System.IComparable.CompareTo
    如果不是TypeOf(obj)是CurrencyType,则
    抛出新ArgumentException(“对象不是货币类型”)
    其他的
    尺寸c2为CurrencyType=CType(obj,CurrencyType)
    返回我.CurrencyID.CompareTo(c2.CurrencyID)
    如果结束
    端函数
    末级
    私有货币作为列表(货币类型)
    公共分新()
    _货币=新列表(货币类型)
    端接头
    私有子AddStructList(CurrencyID为整数,IsoCurrencySymbol为字符串,CurrencySymbol为字符串,金额为十进制)
    如果IsoCurrencySymbol字符串.Empty且金额>0,则
    Dim s作为新的CurrencyType
    s、 CurrencyID=CurrencyID
    s、 等电流符号=等电流符号
    s、 CurrencySymbol=CurrencySymbol
    s、 金额=金额
    _货币.添加(s)
    如果结束
    端接头
    公共子加法(CurrencyID为整数,IsoCurrencySymbol为字符串,CurrencySymbol为字符串,金额为十进制)
    按CurrencyType=\u currences.Find(函数(obj)obj.CurrencyID=CurrencyID)调整ct
    如果ct不是什么,那么
    ct.金额+=金额
    其他的
    AddStructList(CurrencyID、IsoCurrencySymbol、CurrencySymbol、Amount)
    如果结束
    端接头
    公共分区清除()
    _货币
    端接头
    公共函数Count()为整数
    Return\u currences.Count
    端函数
    公共函数RenderTotals()作为字符串
    ' ...
    端函数
    末级
    
    不,你不能那样做。继承的关键在于确保所有派生类(如果没有其他派生类的话)至少与其基类共享同一个公共接口。如果要删除属性,则该属性不共享同一接口,因此不兼容,也不是继承的候选对象

    若不能说派生类是基类的一种类型,那个么就不能使用继承。例如,我可以说汽车是一种交通工具,因此,如果我有一个汽车类,我可以让它从一个汽车类继承。然而,我不能说昆虫是一种交通工具。因此,即使它们共享大多数共同点,我也不能让昆虫类继承自vehicle类

    此限制的原因是继承允许您将对象视为基本类型(通过类型转换)。例如:

    Public Sub AddPassengerToVehicle(v As Vehicle)
        v.Passengers.Add(New Passenger())
    End Sub
    
    ' ...
    
    Dim auto As New Automobile()
    Dim bug As New Insect()
    AddPassengerToVehicle(auto) ' Works because an automobile is a type vehicle (inherits from vehicle)
    AddPassengerToVehicle(bug) ' Can't possibly work (nor should it)
    
    Public Class Vehicle
        Public Property Passengers As List(Of Passenger)
        Public Property MaxSpeed As Integer
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return (speed > MaxSpeed)
        End Function
    End Class
    
    Public Class Insect
        Public Property MaxSpeed As Integer
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return (speed > MaxSpeed)
        End Function
    End Class
    
    Public Class Insect
        Private _vehicle As New Vehicle()
    
        Public Property MaxSpeed() As Integer
            Get
                Return _vehicle.MaxSpeed
            End Get
            Set(value As Integer)
                _vehicle.MaxSpeed = value
            End Set
        End Property
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return _vehicle.SpeedIsTooFast(speed)
        End Function
    End Class
    
    Public Interface ISelfPoweredMovingThing
        Property MaxSpeed As Integer
        Function SpeedIsTooFast(speed As Integer) As Boolean
    End Interface
    
    Public Class SelfPoweredMovingThing
        Public Property MaxSpeed As Integer
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return (speed > MaxSpeed)
        End Function
    End Class
    
    Public Class Vehicle
        Inherits SelfPoweredMovingThing
    
        Public Property Passengers As List(Of Passenger)
    End Class
    
    Public Class Insect
        Inherits SelfPoweredMovingThing
    
        ' Anything else specific only to insects...
    End Class
    
    因此,如果您需要一个派生类来删除/隐藏其基类的一个成员,那么您的方向是错误的。在这种情况下,您需要创建一个全新的类,该类恰好具有非常相似的接口,但与第一个类没有直接关系,例如:

    Public Sub AddPassengerToVehicle(v As Vehicle)
        v.Passengers.Add(New Passenger())
    End Sub
    
    ' ...
    
    Dim auto As New Automobile()
    Dim bug As New Insect()
    AddPassengerToVehicle(auto) ' Works because an automobile is a type vehicle (inherits from vehicle)
    AddPassengerToVehicle(bug) ' Can't possibly work (nor should it)
    
    Public Class Vehicle
        Public Property Passengers As List(Of Passenger)
        Public Property MaxSpeed As Integer
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return (speed > MaxSpeed)
        End Function
    End Class
    
    Public Class Insect
        Public Property MaxSpeed As Integer
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return (speed > MaxSpeed)
        End Function
    End Class
    
    Public Class Insect
        Private _vehicle As New Vehicle()
    
        Public Property MaxSpeed() As Integer
            Get
                Return _vehicle.MaxSpeed
            End Get
            Set(value As Integer)
                _vehicle.MaxSpeed = value
            End Set
        End Property
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return _vehicle.SpeedIsTooFast(speed)
        End Function
    End Class
    
    Public Interface ISelfPoweredMovingThing
        Property MaxSpeed As Integer
        Function SpeedIsTooFast(speed As Integer) As Boolean
    End Interface
    
    Public Class SelfPoweredMovingThing
        Public Property MaxSpeed As Integer
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return (speed > MaxSpeed)
        End Function
    End Class
    
    Public Class Vehicle
        Inherits SelfPoweredMovingThing
    
        Public Property Passengers As List(Of Passenger)
    End Class
    
    Public Class Insect
        Inherits SelfPoweredMovingThing
    
        ' Anything else specific only to insects...
    End Class
    
    如果您想要共享功能,例如上面示例中的
    speedistofast
    方法中的逻辑,那么有几种不同的方法可以实现。首先是生成包装器方法,这些方法只调用另一个类,例如:

    Public Sub AddPassengerToVehicle(v As Vehicle)
        v.Passengers.Add(New Passenger())
    End Sub
    
    ' ...
    
    Dim auto As New Automobile()
    Dim bug As New Insect()
    AddPassengerToVehicle(auto) ' Works because an automobile is a type vehicle (inherits from vehicle)
    AddPassengerToVehicle(bug) ' Can't possibly work (nor should it)
    
    Public Class Vehicle
        Public Property Passengers As List(Of Passenger)
        Public Property MaxSpeed As Integer
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return (speed > MaxSpeed)
        End Function
    End Class
    
    Public Class Insect
        Public Property MaxSpeed As Integer
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return (speed > MaxSpeed)
        End Function
    End Class
    
    Public Class Insect
        Private _vehicle As New Vehicle()
    
        Public Property MaxSpeed() As Integer
            Get
                Return _vehicle.MaxSpeed
            End Get
            Set(value As Integer)
                _vehicle.MaxSpeed = value
            End Set
        End Property
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return _vehicle.SpeedIsTooFast(speed)
        End Function
    End Class
    
    Public Interface ISelfPoweredMovingThing
        Property MaxSpeed As Integer
        Function SpeedIsTooFast(speed As Integer) As Boolean
    End Interface
    
    Public Class SelfPoweredMovingThing
        Public Property MaxSpeed As Integer
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return (speed > MaxSpeed)
        End Function
    End Class
    
    Public Class Vehicle
        Inherits SelfPoweredMovingThing
    
        Public Property Passengers As List(Of Passenger)
    End Class
    
    Public Class Insect
        Inherits SelfPoweredMovingThing
    
        ' Anything else specific only to insects...
    End Class
    
    如果这样做,最好让两个类实现相同的公共接口,以便在必要时可以互换使用它们,例如:

    Public Sub AddPassengerToVehicle(v As Vehicle)
        v.Passengers.Add(New Passenger())
    End Sub
    
    ' ...
    
    Dim auto As New Automobile()
    Dim bug As New Insect()
    AddPassengerToVehicle(auto) ' Works because an automobile is a type vehicle (inherits from vehicle)
    AddPassengerToVehicle(bug) ' Can't possibly work (nor should it)
    
    Public Class Vehicle
        Public Property Passengers As List(Of Passenger)
        Public Property MaxSpeed As Integer
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return (speed > MaxSpeed)
        End Function
    End Class
    
    Public Class Insect
        Public Property MaxSpeed As Integer
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return (speed > MaxSpeed)
        End Function
    End Class
    
    Public Class Insect
        Private _vehicle As New Vehicle()
    
        Public Property MaxSpeed() As Integer
            Get
                Return _vehicle.MaxSpeed
            End Get
            Set(value As Integer)
                _vehicle.MaxSpeed = value
            End Set
        End Property
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return _vehicle.SpeedIsTooFast(speed)
        End Function
    End Class
    
    Public Interface ISelfPoweredMovingThing
        Property MaxSpeed As Integer
        Function SpeedIsTooFast(speed As Integer) As Boolean
    End Interface
    
    Public Class SelfPoweredMovingThing
        Public Property MaxSpeed As Integer
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return (speed > MaxSpeed)
        End Function
    End Class
    
    Public Class Vehicle
        Inherits SelfPoweredMovingThing
    
        Public Property Passengers As List(Of Passenger)
    End Class
    
    Public Class Insect
        Inherits SelfPoweredMovingThing
    
        ' Anything else specific only to insects...
    End Class
    
    另一种选择是将通用功能划分为第三个类,然后将该类用作其他两个类的基础,例如:

    Public Sub AddPassengerToVehicle(v As Vehicle)
        v.Passengers.Add(New Passenger())
    End Sub
    
    ' ...
    
    Dim auto As New Automobile()
    Dim bug As New Insect()
    AddPassengerToVehicle(auto) ' Works because an automobile is a type vehicle (inherits from vehicle)
    AddPassengerToVehicle(bug) ' Can't possibly work (nor should it)
    
    Public Class Vehicle
        Public Property Passengers As List(Of Passenger)
        Public Property MaxSpeed As Integer
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return (speed > MaxSpeed)
        End Function
    End Class
    
    Public Class Insect
        Public Property MaxSpeed As Integer
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return (speed > MaxSpeed)
        End Function
    End Class
    
    Public Class Insect
        Private _vehicle As New Vehicle()
    
        Public Property MaxSpeed() As Integer
            Get
                Return _vehicle.MaxSpeed
            End Get
            Set(value As Integer)
                _vehicle.MaxSpeed = value
            End Set
        End Property
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return _vehicle.SpeedIsTooFast(speed)
        End Function
    End Class
    
    Public Interface ISelfPoweredMovingThing
        Property MaxSpeed As Integer
        Function SpeedIsTooFast(speed As Integer) As Boolean
    End Interface
    
    Public Class SelfPoweredMovingThing
        Public Property MaxSpeed As Integer
    
        Public Function SpeedIsTooFast(speed) As Boolean
            Return (speed > MaxSpeed)
        End Function
    End Class
    
    Public Class Vehicle
        Inherits SelfPoweredMovingThing
    
        Public Property Passengers As List(Of Passenger)
    End Class
    
    Public Class Insect
        Inherits SelfPoweredMovingThing
    
        ' Anything else specific only to insects...
    End Class
    

    嗨,史蒂文。这是一个非常好的答案。非常感谢您花时间将其细分为我的门外汉级别:-)