473,394 Members | 1,746 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,394 software developers and data experts.

interface odd behavior

I've come across something in Interface implementation that I am not sure is
correct behavior in VB.NET (and maybe C#) or not?

Consider following example:

Public Interface IShape

Sub Draw()

End Interface

Public Class CCircle

Implements IShape

Public Sub DifferentDraw() Implements IShape.Draw

End Sub

End Class

According to OOP rules any CCircle object *IS-A* IShape object and also
IShape interface is a *CONTRACT* that guarantees all of its objects
implement methods in this contract. But in the following test, obj2 which is
supposed to obey above rules does not have access to Interface Draw()
method!!!???

Public Class Test

Public Sub Test()

Dim obj1 As IShape

obj1 = New CCircle

obj1.Draw()

Dim obj2 As CCircle

obj2 = New CCircle

obj2.DifferentDraw()

End Sub

End Class

Thanks

Masoud


Nov 21 '05 #1
12 1276
I think you need to cast obj2 to IShape in order to directly access the
interface members:

DirectCast(obj2,IShape).Draw()

Nov 21 '05 #2

"Chris Dunaway" <du******@gmail.com> wrote in message
news:11*********************@g49g2000cwa.googlegro ups.com...
I think you need to cast obj2 to IShape in order to directly access the
interface members:

DirectCast(obj2,IShape).Draw()

It is not a *have to* to cast a derived class to its base in hierarchy to
use base defined methods.

Think of ToString method of class Object, shall every class has a cast for
that?

Actually it is polymorphic behavior of OO languages that let us use a
derived class and access with the base methods.


Nov 21 '05 #3
hi, Masud

When you actually do
obj2.DifferentDraw()
You are calling the IShape 's Draw method but implemented by you in Ccircle
class.
It will be of no use to call Interface methods, because they themselves are
empty anyway.

HTH
Irfan

"masoud bayan" <ma**********@hotmail.com> wrote in message
news:uO**************@TK2MSFTNGP14.phx.gbl...
I've come across something in Interface implementation that I am not sure
is
correct behavior in VB.NET (and maybe C#) or not?

Consider following example:

Public Interface IShape

Sub Draw()

End Interface

Public Class CCircle

Implements IShape

Public Sub DifferentDraw() Implements IShape.Draw

End Sub

End Class

According to OOP rules any CCircle object *IS-A* IShape object and also
IShape interface is a *CONTRACT* that guarantees all of its objects
implement methods in this contract. But in the following test, obj2 which
is
supposed to obey above rules does not have access to Interface Draw()
method!!!???

Public Class Test

Public Sub Test()

Dim obj1 As IShape

obj1 = New CCircle

obj1.Draw()

Dim obj2 As CCircle

obj2 = New CCircle

obj2.DifferentDraw()

End Sub

End Class

Thanks

Masoud

Nov 21 '05 #4
Masoud,

Think of ToString method of class Object, shall every class has a cast for
that?

The ToString() method is a member of Object. Object is not an interface
however the base class from which every class inherits.

Cor
Nov 21 '05 #5
Ok.

I agree that ToString is defined in base class but what does it mean that
Interface is a Contract the guarantees every object derived from that
Interface implement s the methods in that contract?

Think someone defined IShape and then created a method as:

Public Sub(obj as IShape)

obj.draw()

End Sub

This method according to the test that I sent is not working anymore!!

Regarding "Tostring is method with implementation in base class", I think as
..net (and modern OOP languages) does not support multiple inheritance we
have interfaces but it does not mean inheritance and polymorphic behavior
should change. If we define an abstract method in an abstract class shall we
cast derived objects to base to be able to access the name of method?

Masoud

"Irfan" <ir***@asc-ltd.co.uk> wrote in message
news:u%****************@TK2MSFTNGP15.phx.gbl...
hi, Masud

When you actually do
obj2.DifferentDraw()
You are calling the IShape 's Draw method but implemented by you in Ccircle class.
It will be of no use to call Interface methods, because they themselves are empty anyway.

HTH
Irfan

"masoud bayan" <ma**********@hotmail.com> wrote in message
news:uO**************@TK2MSFTNGP14.phx.gbl...
I've come across something in Interface implementation that I am not sure is
correct behavior in VB.NET (and maybe C#) or not?

Consider following example:

Public Interface IShape

Sub Draw()

End Interface

Public Class CCircle

Implements IShape

Public Sub DifferentDraw() Implements IShape.Draw

End Sub

End Class

According to OOP rules any CCircle object *IS-A* IShape object and also
IShape interface is a *CONTRACT* that guarantees all of its objects
implement methods in this contract. But in the following test, obj2 which is
supposed to obey above rules does not have access to Interface Draw()
method!!!???

Public Class Test

Public Sub Test()

Dim obj1 As IShape

obj1 = New CCircle

obj1.Draw()

Dim obj2 As CCircle

obj2 = New CCircle

obj2.DifferentDraw()

End Sub

End Class

Thanks

Masoud


Nov 21 '05 #6
"masoud bayan" <ma**********@hotmail.com> schrieb
I've come across something in Interface implementation that I am not
sure is correct behavior in VB.NET (and maybe C#) or not?

Consider following example:

Public Interface IShape

Sub Draw()

End Interface

Public Class CCircle

Implements IShape

Public Sub DifferentDraw() Implements IShape.Draw

End Sub

End Class

According to OOP rules any CCircle object *IS-A* IShape object and
also IShape interface is a *CONTRACT* that guarantees all of its
objects implement methods in this contract. But in the following
test, obj2 which is supposed to obey above rules does not have access
to Interface Draw() method!!!???

obj2 is not declared as IShape. You are using a different contract. The
contract name now is "CCircle" - that's how the variable is declare - and a
CCircle does have a DifferentDraw method. It does not have a Draw method
because it's not part of the contract.
Public Class Test

Public Sub Test()

Dim obj1 As IShape

obj1 = New CCircle

obj1.Draw()

Dim obj2 As CCircle

obj2 = New CCircle

obj2.DifferentDraw()

End Sub

End Class

Armin

Nov 21 '05 #7
masoud,
In addition to the other comments.

C# partially supports this with Explicit Interface Implementation.

http://msdn.microsoft.com/library/de...pec_13_4_1.asp

I find the VB.NET to be stronger here, as I can rename the method and/or
change the visibility of the method. C# only allows you to hide the method.

| According to OOP rules any CCircle object *IS-A* IShape object and also
| IShape interface is a *CONTRACT* that guarantees all of its objects
| implement methods in this contract. But in the following test, obj2 which
is
| supposed to obey above rules does not have access to Interface Draw()
| method!!!???
Circle implements all the methods of IShape! however it simply renamed
and/or hide one or more of its methods. As you show, when an instance of a
Circle object is in an IShape variable or parameter you can access all of
IShape's methods.

Consider IDisposable. For some classes, such as Files, it makes more sense
to name IDisposable.Dispose method Close as its more logical to Close a file
rather then Dispose it.

If the IDisposable.Dispose method was required to be called Dispose it might
add confusion to other programmers using your class, especially if the class
offers both Dispose & Close.

Also consider IList, when defining a type safe list (such as CollectionBase)
its desired to hide most of the IList members, such as IList.Add(Object),
offering type safe versions PersonCollection.Add(Person) instead.

Consider:

Public Interface IShape
Sub Draw()
End Interface

Public Interface IDeckOfCards
Function Draw() As Card
End Interface

If you attempt to implement both interfaces, such as:

Public Class CCircle
Implements IShape
Implements IDeckOfCards

Public Sub Draw() Implements IShape.Draw
End Sub

Public Function Draw() As Card Implements IDeckOfCards.Draw

End Function

End Class

Without renaming, the above won't compile, as Draw is both a function & a
Sub. Further they do different things. IShape.Draw paints the shape on the
screen, while IDeckOfCards.Draw returns a card.

With renaming you can do:

Public Class CCircle
Implements IShape
Implements IDeckOfCards

Public Sub DrawShape() Implements IShape.Draw
End Sub

Public Function DrawCard() As Card Implements IDeckOfCards.Draw

End Function

End Class

Which avoids ambiguity in the public interface of Circle.

Hope this helps
Jay
"masoud bayan" <ma**********@hotmail.com> wrote in message
news:uO**************@TK2MSFTNGP14.phx.gbl...
| I've come across something in Interface implementation that I am not sure
is
| correct behavior in VB.NET (and maybe C#) or not?
|
|
|
| Consider following example:
|
|
|
| Public Interface IShape
|
| Sub Draw()
|
| End Interface
|
|
|
| Public Class CCircle
|
| Implements IShape
|
| Public Sub DifferentDraw() Implements IShape.Draw
|
| End Sub
|
| End Class
|
|
|
| According to OOP rules any CCircle object *IS-A* IShape object and also
| IShape interface is a *CONTRACT* that guarantees all of its objects
| implement methods in this contract. But in the following test, obj2 which
is
| supposed to obey above rules does not have access to Interface Draw()
| method!!!???
|
|
|
| Public Class Test
|
| Public Sub Test()
|
| Dim obj1 As IShape
|
| obj1 = New CCircle
|
| obj1.Draw()
|
|
|
| Dim obj2 As CCircle
|
| obj2 = New CCircle
|
| obj2.DifferentDraw()
|
| End Sub
|
| End Class
|
|
|
| Thanks
|
| Masoud
|
|
|
|
Nov 21 '05 #8
"Irfan" <ir***@asc-ltd.co.uk> wrote in message
news:u%****************@TK2MSFTNGP15.phx.gbl...
When you actually do
obj2.DifferentDraw()
you are calling the IShape's Draw method
*Not* true. obj2 is defined as a CCircle and, therefore, can
only access the methods, etc. defined by CCircle.
To use methods defined via the IShape Interface, you must cast
the object to the Interface Type, as in

DirectCast( obj2, IShape ).Draw()

or, better,

Dim obj2 as IShape
obj2.Draw()
It will be of no use to call Interface methods, because they
themselves are empty anyway.


/If/ I understand this statement correctly (apologies if not) then
you've missed something fundamental about Interfaces.

The Interface /defines/ the methods, etc. that a class must
provide implementations for in order to be used as an "instance"
of the Interface. The Interface methods are not "empty" as you
describe; the actual code "behind" them is provided (somewhere)
in every Class that implements the Interface.

Regards,
Phill W.
Nov 21 '05 #9
Thanks Jay, was great information.

Also thanks all others for their comments.

Just the last question:

There is only one problem though if someone defines an IShape interface with
Draw method and then a function as for feature objects of IShape:

Sub Test(obj as IShape)

Obj.Draw

End Sub

There is no guarantee that this function will work in future as maybe
somebody change Draw to something else in feature, except he explicitly cast
obj to Ishape in code.

So shall whenever we want to use an object in .net hierarchy and call a
method that we assume should be available in object (because of an interface
in hierarchy) first cast it to interface?

Masoud


"Jay B. Harlow [MVP - Outlook]" <Ja************@msn.com> wrote in message
news:Oy****************@TK2MSFTNGP10.phx.gbl...
masoud,
In addition to the other comments.

C# partially supports this with Explicit Interface Implementation.

http://msdn.microsoft.com/library/de...pec_13_4_1.asp
I find the VB.NET to be stronger here, as I can rename the method and/or
change the visibility of the method. C# only allows you to hide the method.
| According to OOP rules any CCircle object *IS-A* IShape object and also
| IShape interface is a *CONTRACT* that guarantees all of its objects
| implement methods in this contract. But in the following test, obj2 which is
| supposed to obey above rules does not have access to Interface Draw()
| method!!!???
Circle implements all the methods of IShape! however it simply renamed
and/or hide one or more of its methods. As you show, when an instance of a
Circle object is in an IShape variable or parameter you can access all of
IShape's methods.

Consider IDisposable. For some classes, such as Files, it makes more sense
to name IDisposable.Dispose method Close as its more logical to Close a file rather then Dispose it.

If the IDisposable.Dispose method was required to be called Dispose it might add confusion to other programmers using your class, especially if the class offers both Dispose & Close.

Also consider IList, when defining a type safe list (such as CollectionBase) its desired to hide most of the IList members, such as IList.Add(Object),
offering type safe versions PersonCollection.Add(Person) instead.

Consider:

Public Interface IShape
Sub Draw()
End Interface

Public Interface IDeckOfCards
Function Draw() As Card
End Interface

If you attempt to implement both interfaces, such as:

Public Class CCircle
Implements IShape
Implements IDeckOfCards

Public Sub Draw() Implements IShape.Draw
End Sub

Public Function Draw() As Card Implements IDeckOfCards.Draw

End Function

End Class

Without renaming, the above won't compile, as Draw is both a function & a
Sub. Further they do different things. IShape.Draw paints the shape on the
screen, while IDeckOfCards.Draw returns a card.

With renaming you can do:

Public Class CCircle
Implements IShape
Implements IDeckOfCards

Public Sub DrawShape() Implements IShape.Draw
End Sub

Public Function DrawCard() As Card Implements IDeckOfCards.Draw

End Function

End Class

Which avoids ambiguity in the public interface of Circle.

Hope this helps
Jay
"masoud bayan" <ma**********@hotmail.com> wrote in message
news:uO**************@TK2MSFTNGP14.phx.gbl...
| I've come across something in Interface implementation that I am not sure is
| correct behavior in VB.NET (and maybe C#) or not?
|
|
|
| Consider following example:
|
|
|
| Public Interface IShape
|
| Sub Draw()
|
| End Interface
|
|
|
| Public Class CCircle
|
| Implements IShape
|
| Public Sub DifferentDraw() Implements IShape.Draw
|
| End Sub
|
| End Class
|
|
|
| According to OOP rules any CCircle object *IS-A* IShape object and also
| IShape interface is a *CONTRACT* that guarantees all of its objects
| implement methods in this contract. But in the following test, obj2 which is
| supposed to obey above rules does not have access to Interface Draw()
| method!!!???
|
|
|
| Public Class Test
|
| Public Sub Test()
|
| Dim obj1 As IShape
|
| obj1 = New CCircle
|
| obj1.Draw()
|
|
|
| Dim obj2 As CCircle
|
| obj2 = New CCircle
|
| obj2.DifferentDraw()
|
| End Sub
|
| End Class
|
|
|
| Thanks
|
| Masoud
|
|
|
|

Nov 21 '05 #10
masoud,
| There is only one problem though if someone defines an IShape interface
with
| Draw method and then a function as for feature objects of IShape:
I don't see a problem...

| Sub Test(obj as IShape)
|
| Obj.Draw
|
| End Sub

| There is no guarantee that this function will work in future as maybe
| somebody change Draw to something else in feature, except he explicitly
cast
| obj to Ishape in code.
Yes there is a "guarantee". The "Implements IShape.Draw" on the Sub's
declaration is the "guarantee".

| > Public Sub Draw() Implements IShape.Draw
| > End Sub

When you pass the Circle object to the IShape parameter, the Test function
will call the method labeled with "Implements IShape.Draw", independent of
what you named the method itself in Circle...

C# does not use the "Implements IShape.Draw" syntax, which is why the method
in C# either needs to be public or it needs to use the Explicit Interface
Implementation syntax. I find the "Implements IShape.Draw" syntax to be far
more flexible.

Hope this helps
Jay
"masoud bayan" <ma**********@hotmail.com> wrote in message
news:Oh****************@TK2MSFTNGP14.phx.gbl...
| Thanks Jay, was great information.
|
| Also thanks all others for their comments.
|
|
|
| Just the last question:
|
| There is only one problem though if someone defines an IShape interface
with
| Draw method and then a function as for feature objects of IShape:
|
| Sub Test(obj as IShape)
|
| Obj.Draw
|
| End Sub
|
|
|
| There is no guarantee that this function will work in future as maybe
| somebody change Draw to something else in feature, except he explicitly
cast
| obj to Ishape in code.
|
| So shall whenever we want to use an object in .net hierarchy and call a
| method that we assume should be available in object (because of an
interface
| in hierarchy) first cast it to interface?
|
|
|
| Masoud
|
|
|
|
| "Jay B. Harlow [MVP - Outlook]" <Ja************@msn.com> wrote in message
| news:Oy****************@TK2MSFTNGP10.phx.gbl...
| > masoud,
| > In addition to the other comments.
| >
| > C# partially supports this with Explicit Interface Implementation.
| >
| >
|
http://msdn.microsoft.com/library/de...pec_13_4_1.asp
| >
| > I find the VB.NET to be stronger here, as I can rename the method and/or
| > change the visibility of the method. C# only allows you to hide the
| method.
| >
| > | According to OOP rules any CCircle object *IS-A* IShape object and
also
| > | IShape interface is a *CONTRACT* that guarantees all of its objects
| > | implement methods in this contract. But in the following test, obj2
| which
| > is
| > | supposed to obey above rules does not have access to Interface Draw()
| > | method!!!???
| > Circle implements all the methods of IShape! however it simply renamed
| > and/or hide one or more of its methods. As you show, when an instance of
a
| > Circle object is in an IShape variable or parameter you can access all
of
| > IShape's methods.
| >
| > Consider IDisposable. For some classes, such as Files, it makes more
sense
| > to name IDisposable.Dispose method Close as its more logical to Close a
| file
| > rather then Dispose it.
| >
| > If the IDisposable.Dispose method was required to be called Dispose it
| might
| > add confusion to other programmers using your class, especially if the
| class
| > offers both Dispose & Close.
| >
| > Also consider IList, when defining a type safe list (such as
| CollectionBase)
| > its desired to hide most of the IList members, such as
IList.Add(Object),
| > offering type safe versions PersonCollection.Add(Person) instead.
| >
| > Consider:
| >
| > Public Interface IShape
| > Sub Draw()
| > End Interface
| >
| > Public Interface IDeckOfCards
| > Function Draw() As Card
| > End Interface
| >
| > If you attempt to implement both interfaces, such as:
| >
| > Public Class CCircle
| > Implements IShape
| > Implements IDeckOfCards
| >
| > Public Sub Draw() Implements IShape.Draw
| > End Sub
| >
| > Public Function Draw() As Card Implements IDeckOfCards.Draw
| >
| > End Function
| >
| > End Class
| >
| > Without renaming, the above won't compile, as Draw is both a function &
a
| > Sub. Further they do different things. IShape.Draw paints the shape on
the
| > screen, while IDeckOfCards.Draw returns a card.
| >
| > With renaming you can do:
| >
| > Public Class CCircle
| > Implements IShape
| > Implements IDeckOfCards
| >
| > Public Sub DrawShape() Implements IShape.Draw
| > End Sub
| >
| > Public Function DrawCard() As Card Implements IDeckOfCards.Draw
| >
| > End Function
| >
| > End Class
| >
| > Which avoids ambiguity in the public interface of Circle.
| >
| > Hope this helps
| > Jay
| >
| >
| > "masoud bayan" <ma**********@hotmail.com> wrote in message
| > news:uO**************@TK2MSFTNGP14.phx.gbl...
| > | I've come across something in Interface implementation that I am not
| sure
| > is
| > | correct behavior in VB.NET (and maybe C#) or not?
| > |
| > |
| > |
| > | Consider following example:
| > |
| > |
| > |
| > | Public Interface IShape
| > |
| > | Sub Draw()
| > |
| > | End Interface
| > |
| > |
| > |
| > | Public Class CCircle
| > |
| > | Implements IShape
| > |
| > | Public Sub DifferentDraw() Implements IShape.Draw
| > |
| > | End Sub
| > |
| > | End Class
| > |
| > |
| > |
| > | According to OOP rules any CCircle object *IS-A* IShape object and
also
| > | IShape interface is a *CONTRACT* that guarantees all of its objects
| > | implement methods in this contract. But in the following test, obj2
| which
| > is
| > | supposed to obey above rules does not have access to Interface Draw()
| > | method!!!???
| > |
| > |
| > |
| > | Public Class Test
| > |
| > | Public Sub Test()
| > |
| > | Dim obj1 As IShape
| > |
| > | obj1 = New CCircle
| > |
| > | obj1.Draw()
| > |
| > |
| > |
| > | Dim obj2 As CCircle
| > |
| > | obj2 = New CCircle
| > |
| > | obj2.DifferentDraw()
| > |
| > | End Sub
| > |
| > | End Class
| > |
| > |
| > |
| > | Thanks
| > |
| > | Masoud
| > |
| > |
| > |
| > |
| >
| >
|
|
Nov 21 '05 #11
"masoud bayan" <ma**********@hotmail.com> schrieb:
There is only one problem though if someone defines an IShape interface
with
Draw method and then a function as for feature objects of IShape:

Sub Test(obj as IShape)

Obj.Draw

End Sub

There is no guarantee that this function will work in future as maybe
somebody change Draw to something else in feature, except he explicitly
cast
obj to Ishape in code.


The type of the 'obj' parameter is already 'IShape', thus no cast is
necessary.

--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://classicvb.org/petition/>

Nov 21 '05 #12
Thanks for all replies.

Masoud

"Herfried K. Wagner [MVP]" <hi***************@gmx.at> wrote in message
news:eN**************@TK2MSFTNGP09.phx.gbl...
"masoud bayan" <ma**********@hotmail.com> schrieb:
There is only one problem though if someone defines an IShape interface
with
Draw method and then a function as for feature objects of IShape:

Sub Test(obj as IShape)

Obj.Draw

End Sub

There is no guarantee that this function will work in future as maybe
somebody change Draw to something else in feature, except he explicitly
cast
obj to Ishape in code.


The type of the 'obj' parameter is already 'IShape', thus no cast is
necessary.

--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://classicvb.org/petition/>

Nov 21 '05 #13

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

20
by: Simon Harvey | last post by:
Festive greetings fellow programmers! I've been programming now for about 4, maybe 5 years now. 4 of those years were at university so and I havent had much work experience of making real world...
3
by: Christof Warlich | last post by:
Hi, I'm looking for a more concise way than below to extend an existing interface. Just imagine that class Interface would have 1000 other members and class DerivedInterface only needs to add...
2
by: bingomanatee | last post by:
Is there any way to determine if a class is a member of an interface? For a concrete example: I am implementing a "node" (Node_if) interface on database record representing objects (children of the...
10
by: Brett | last post by:
I'm still trying to figure out concrete reasons to use one over the other. I understand the abstract class can have implementation in its methods and derived classes can only inherit one abstract...
6
by: John Salerno | last post by:
I understand how they work (basically), but I think maybe the examples I'm reading are too elementary to really show their value. Here's one from Programming C#: #region Using directives ...
4
by: Ray Dukes | last post by:
What I am looking to do is map the implementation of interface properties and functions to an inherited method of the base class. Please see below. ...
13
by: ^MisterJingo^ | last post by:
I've been reading up on interfaces, one example I came across showed that you can hide a method implemented from an interface from the class which implements it. To use it, you must cast to the...
20
by: Andy DeMaurice | last post by:
Something has changed from C# 1.0 to 2.0 regarding interface re-implementation. See my sample code below; when compiled and run under VS 2003, you get: Control.Paint Control.IControl.Paint ...
7
by: p_shakil | last post by:
Hi, I would like to know the interface concept in Python.How the Interface is defined and implemented in Python?. How to access the interface fromn Client? Thanks PSB
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.