Class Inheritance and Business BaseClass Inheritance and Business Base
Old forum URL: forums.lhotka.net/forums/t/242.aspx
Tim FOrd posted on Thursday, June 01, 2006
Hi All,
I need a little with the the understanding of the BusinessBase class and the use of the (of section)
I have 1 class called BestDay which has a set of properties etc
Public Class Bestday : Inherits BusinessBase(Of Bestday)
I also have a need for a customer Bestday Class and Location BestDay Class because i need to reuse all the properties from the bestday class and extended the interface with a customer id and location id. Is this possible??, i have tried this.
Public Class CustomerBestday : Inherits BusinessBase(Of Bestday)
Public Class LocationBestday : Inherits BusinessBase(Of Bestday)
But i can't and of the underlining bestday properties when i call this code from the interface.
Dim objCustomerBestDay As BusinessObjects.CustomerBestday
objCustomerBestDay.???? I only see the CustomerID property which i defined in CustomerBestdays
If this is possible i take it i will be able to overrides the dataportal section as i will need to call different storedprocedures to reutrn data. I have tried to explain this as best as possible, but as i'm starting out i have a feeling i might trying to run before i can walk.
Any help would be greatfully appreciated.
Thanks, Tim.
ajj3085 replied on Thursday, June 01, 2006
I think you need to change:
Public Class CustomerBestday : Inherits BusinessBase(Of Bestday)
Public Class LocationBestday : Inherits BusinessBase(Of Bestday)
to
Public Class CustomerBestday Inherits Bestday(Of Bestday)
Public Class LocationBestday Inherits Bestday(Of Bestday)
HTH
Andy
Tim FOrd replied on Thursday, June 01, 2006
Hi Andy,
Thanks for you reply, i have tried both ways with no success. To to clarify i would like to inherit an object that has inherited the busines base object but still have the ability to over write methods etc. in the top level class.
so it would be like this
the customer and location class would have a nother property attached to them to define the customer and location id. But i would still like to override the fetch methods etc to call different sotred procedures.
I know this is not very clear, but it the best that i can exaplin on what i'm trying to acheive.
Thanks, Tim.
ajj3085 replied on Thursday, June 01, 2006
Hmm,
What about:
Public Class CustomerBestday Inherits Bestday(Of CustomerBestDay)
Public Class LocationBestday Inherits CustomerBestday (Of LocationBestday )
Sorry, I'm not very good with VB; it coudl just be that you need to recompile or restart the IDE.
I know there are a few rare occasions when VS2003 would 'forget' some of the properties / methods of an object because Intillisense gets trashed.
Andy
Tim FOrd replied on Thursday, June 01, 2006
Right lets get it simpler.
BestDay class inherits BusinessBase(of BestDay)
I need to extend the interface of best day in to a CustomerBestDay class
Which i'm pretty sure we are on the right line of
Public Class CustomerBestDay: Inherits Bestday(of CustomerBestDay)
Or
Public Class CustomerBestDay: Inherits Bestday(of BestDay)
when i try and define either of the above in the class i get this error:-
Error 24 'BusinessObjects.Bestday' has no type parameters and so cannot have type arguments.
Cheers for your help andy.
Tim.
RockfordLhotka replied on Thursday, June 01, 2006
Generics complicates inheritance rather a lot - that's one major drawback to their use.
You need to declare BestDay as a generic base class (and thus probably abstract):
Public MustInherit Class BestDay(Of T As BestDay(Of T))
Inherits BusinessBase(Of BestDay(Of T))
Pretty much just like BusinessBase is declared. Then you can create your subclass:
Public Class CustomerBestDay : Inherits BestDay(Of CustomerBestDay)
Make sure you are using CSLA 2.0.1, because it includes a fix to allow the data portal to work properly with this sort of inheritance scheme.
If this doesn't get you want you want, then you need to avoid using generics - at least all the way through your hierarchy. Specifically, if you want to be able to create an instance of BestDay directly, then that must be the end of the generic inheritance chain, and your CustomerBestDay can't have strongly typed Save() and Clone() methods - they'll be of type BestDay and you'll need to cast the results yourself.
Tim FOrd replied on Thursday, June 01, 2006
Guys, thanks for you help exactly what i wanted.
Tim FOrd replied on Friday, June 02, 2006
Guys,
I seem to be getting an error when i now try and create a new instance of the CustomerBestDay Class
Public Shared Function NewBestDay() As BestDay(Of CustomerBestDay)
If Not CanAddObject() Then
Throw New System.Security.SecurityException("User not authorized to add a BestDay")
End If
Return DataPortal.Create(Of CustomerBestDay)()
End Function
and this
Public Shared Function NewBestDay() As BestDay(Of CustomerBestDay)
If Not CanAddObject() Then
Throw New System.Security.SecurityException("User not authorized to add a BestDay")
End If
Return DataPortal.Create(Of BestDay(Of CustomerBestDay))()
End Function
The error i get is {"Cannot create an abstract class."}and i just call the create method incorrectly or am i barking up the wrong tree here??
Thanks, Tim.
Tim FOrd replied on Friday, June 02, 2006
Just for reference, i have had a look on the forums and found this http://forums.lhotka.net/forums/thread/1205.aspx which is exactly the same issue.
Tim.
xal replied on Friday, June 02, 2006
Make sure your criteria class is either in your derived class or if you keep it in your base class, make it inherit from criteria base.
Andrés
Tim FOrd replied on Friday, June 02, 2006
i Have this in my CustomerBestDay Class is that right??
<Serializable()> _
Private Class Criteria
Private mId As Guid
Public ReadOnly Property Id() As Guid
Get
Return mId
End Get
End Property
Public Sub New(ByVal id As Guid)
mId = id
End Sub
End Class
Sorry for being slack, but i haven't really used a framwork like this before. So quite a steap learning curve.
thansk, Tim.
xal replied on Friday, June 02, 2006
Sorry, I missread your message.
Your factory method should be inside CustomerBestDay.
Public Shared Function NewCustomerBestDay() As CustomerBestDay
If Not CanAddObject() Then
Throw New System.Security.SecurityException("User not authorized to add a BestDay")
End If
Return DataPortal.Create(Of CustomerBestDay)()
End Function
Criteria doesn't participate in create in this instance. Also, if you don't need to bring default values from the db you should either mark your dataportal_create method as RunLocal() or just do a:
Return New CustomerBestDay
inside your factory method.
If you're still having trouble, post the exact factory method that fails and tell us where the factory method is. Also post the declarations for each of the classes.
Andrés
Tim FOrd replied on Friday, June 02, 2006
Hi xal,
I have just this minute got it working, a small error on my side ;) i had declare customerbestdays as mustinherit and thus getting the error "Cannot create abstract class" sorry about that.
But as i'm learning can you please tell me which one is the correct way of define this function.
Public Shared Function NewBestDay(ByVal CustomerID As Guid) As BestDay(Of CustomerBestDay)
If Not CanAddObject() Then
Throw New System.Security.SecurityException("User not authorized to add a bestday")
End If
Dim objCriteria As New Criteria(CustomerID)
Return DataPortal.Create(Of CustomerBestDay)(objCriteria)
End Function
OR
Public Shared Function NewBestDay(ByVal CustomerID As Guid) As CustomerBestDay
If Not CanAddObject() Then
Throw New System.Security.SecurityException("User not authorized to add a bestday")
End If
Return DataPortal.Create(Of CustomerBestDay)()
End Function
The main difference being the Method declaration
xal replied on Friday, June 02, 2006
Well, both return a strongly typed object of type CustomerBestDay, the difference is semanthic I'd say. I'd go with "As CustomerBestDay" instead of the other because it's simpler and more straightforward.
Andrés
Copyright (c) Marimer LLC