VB.net的Friend

fjjfxz 2008-01-22 12:06:36
以前学过一点C++
所以对VB.NET中的friend感到很困惑,老是以为类中的友元过程其表现应该和C++一样,所以我在写个简单的程序中(一个有理数类):
Public Class Fraction
#Region "Data Fields"
Private numerator As Integer '分子
Private denominator As Integer '分母
#End Region
#Region "Methods"
Friend Function Add(ByVal f1 As Fraction, ByVal f2 As Fraction) As Fraction
'友元函数,加法为二元运算符,想做成Add(f1,f2)这样求两个分数的和
Dim t1 As Integer
Dim f As New Fraction
t1 = lcm(f1.denomIs(), f2.denomIs())
'numerator = numerator * (t1 / denominator) + frac1.numIs() * (t1 / frac1.denomIs())
f.numerator = f1.numerator * (t1 / f1.denominator) + f2.numerator * (t1 / f2.denominator)
f.denominator = t1
Return f
End Function

Public Function Subtract(ByVal frac1 As Fraction) As Fraction

End Function
Public Function Mult(ByVal frac1 As Fraction) As Fraction

End Function
Public Function numIs() As Integer '返回分子
Return numerator
End Function

Public Function denomIs() As Integer '返回分母
Return denominator
End Function

Public Sub New()

End Sub

Public Sub New(ByVal num As Integer, ByVal denom As Integer)
Dim t1 As Integer
t1 = gcd(num, denom)
num /= t1
denom /= t1
numerator = num
denominator = denom
End Sub

Private Function gcd(ByVal a As Integer, ByVal b As Integer) As Integer '最大公约数
Dim c As Integer
If a < b Then
c = a
a = b
b = c
End If
c = a Mod b
While (c <> 0)
a = b
b = c
c = a Mod b
End While
Return b
End Function

Private Function lcm(ByVal a As Integer, ByVal b As Integer) As Integer '最小公倍数
Dim c As Integer
If a < b Then
c = a
a = b
b = c
End If
c = a
Do While (c Mod b <> 0)
c = c + a
Loop
Return c
End Function
Public Sub Print()
Console.WriteLine(numerator & "/" & denominator)
End Sub
#End Region

End Class

可是我想在模块中:
Module Module1

Sub Main()
Dim a As Fraction = New Fraction(1, 2)
Dim b As New Fraction(1, 3)
Dim c As New Fraction
a.Print()
b.Print()
c = Add(a, b) '<-------------这里无法调用
c.Print()

Console.Read()
End Sub

End Module
想问的是,friend在vb.net中跟c++中的到底有什么不同?
能不能实现二元加Add?
...全文
1298 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fjjfxz 2008-01-25
  • 打赏
  • 举报
回复
感谢楼上的,在VB.net中是太麻烦了,按你的方法
把方法声明成shared,可如何实现对实例成员的调用?
还是感谢楼上的!
vwxyzh 2008-01-25
  • 打赏
  • 举报
回复
Imports NameSpaces.Fraction
加了以后可以直接用这个Fraction类的静态方法
fjjfxz 2008-01-25
  • 打赏
  • 举报
回复
好象还是要用类型名.过程名的方式调用
即:
c=Fraction.Add(a,b)
vwxyzh 2008-01-23
  • 打赏
  • 举报
回复
lz想直接写Add也可以,就是vb.net里面要麻烦一点
1、把Add方法改成Shared
2、在调用处(Module1)添加一个Imports NameSpaces.Fraction
vwxyzh 2008-01-22
  • 打赏
  • 举报
回复
Add是实例方法,需要Fraction实例才能调用
chuxue1342 2008-01-22
  • 打赏
  • 举报
回复
能不能实现二元加Add?
--------------------
应该能够的!
rockyvan 2008-01-22
  • 打赏
  • 举报
回复
C++我沒有接觸過,你自己學過一點,你自己找找區別吧。
rockyvan 2008-01-22
  • 打赏
  • 举报
回复
Friend (Visual Basic)声明上下文。仅可以在模块、接口或命名空间级别使用 Friend。这意味着 Friend 元素的声明上下文必须是源文件、命名空间、接口、模块、类或结构,不能是过程。
fjjfxz 2008-01-22
  • 打赏
  • 举报
回复
但是在VB.NET中,类中某过程声明为Friend,该过程仍然是类的一部分,换句话说,调用这个Friend方法,仍需要使用对象.过程名这样的形式!
足球中国 2008-01-22
  • 打赏
  • 举报
回复
friend 在VB中和C++中是一样的.都是表示友元.
fjjfxz 2008-01-22
  • 打赏
  • 举报
回复
可以用这样的方法来调用:
c=Add(a,b)而不需要象在VB.NET中这样
使用类或对象来调用Add,写在c.Add(a,b)或将其声明为类的方法Shared,用Fraction.Add(a,b)这样丑陋的方式。
唉,不知c#中是不是这样?
fjjfxz 2008-01-22
  • 打赏
  • 举报
回复
Friend在VB.NET中的意义是什么?
C++中friend其实也就是为提高效率而破坏类的封装
如用C++,在上述Fraction类,如果把Add函数声明为友元,Add不是类的组成部分
可以用这样的方法来调用:
c=Add(a,b)而不需要使用类或对象来调用Add,写在c.Add(a,b)或将其声明为类的方法Shared,用Fraction.Add(a,b)这样丑陋的方式。
唉,不知c#中是不是这样?
Lost_Love_Anymore 2008-01-22
  • 打赏
  • 举报
回复
c = Add(a, b)
c = c.Add(a, b)
类的方法调用问题。Add是实例化Fraction 类后C的方法。

16,721

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧