|
Hi, I have a basic enough problem with implementing inheritance in an interface.
Here is an example of what I would LIKE to do:
static void Main(string[] args)
{
List<ISuperString> myStrings = new List<ISuperString>();
myStrings.Add(...SOMETHING...);
Console.WriteLine(myStrings[0].containsCapitalLetters());
Console.WriteLine(myStrings[0].ToLower());
}
public interface ISuperString : string
{
bool containsCapitalLetters();
}
I have seen (and implemented) some workarounds for this, however they are a bit messy for my taste.
Basically, is it possible to either have an interface inherit from a class or to derive an interface from a class (i.e. an IString interface)?
thanks
|
|
|
|
|
What I think you really want is an extension method.
public class ExtensionMethods
{
public static bool ContainsCapitalLetters(this String)
{
bool result = false;
return result;
}
}
Usage would be
String myString = "AbcdefG";
bool containsCapitalLetters = myString.ContainsCapitalLetters(); .45 ACP - because shooting twice is just silly ----- "Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "The staggering layers of obscenity in your statement make it a work of art on so many levels." - J. Jystad, 2001
|
|
|
|
|
As the string class is sealed you cannot subclass it to force it to implement your interface.
If it's just methods you want to add and you're using 3.5 or 4.0 then you can use extension methods as John suggested.
If you want to add more than methods or are using 2.0 then you will need to create a wrapper around the string class - something like this will get you started
public class SuperString : ISuperString
{
private string wrappedString;
public SuperString(string stringToWrap)
{
wrappedString = stringToWrap;
}
public static implicit operator string(SuperString superString)
{
return superString.wrappedString;
}
public static implicit operator SuperString(string stringToWrap)
{
return new SuperString(stringToWrap);
}
public bool containsCapitalLetters()
{
throw new NotImplementedException();
}
}
public interface ISuperString
{
bool containsCapitalLetters();
}
|
|
|
|
|
DaveyM69 wrote: and you're using 3.5 or 4.0
Or 2.0!
Just add
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
public sealed class ExtensionAttribute : Attribute
{
public ExtensionAttribute() { }
}
}
And set the compiler to C#3
|
|
|
|
|
So you're saying extension methods can be used in Visual Studio 2005? Sounds like a really good tip/trick!
|
|
|
|
|
AFAIK no, it does require the new compiler (and it would probably mess up IntelliSense on VS05), but with this trick you can target .NET 2.0 (with VS08 and higher) and still use extension methods
|
|
|
|
|
Thanks guys, however the problem goes a bit deeper than my string example
(and btw, I didn't realise a string was sealed so I suppose that turned my oversimplification on its head)
What I need is an interface to use within a function (like in the list above)
A wrapper class would work fine (and at the moment I am using a wrapper interface) but inheriting from a class to an interface would be a LOT cleaner.
|
|
|
|
|
Not really sure what your question is. Sounds like you just want to create an interface and implement it with a class. That's pretty basic C#... that's all I've gathered from your question (now that you've added the disclaimer about not using string as an example anymore because it's sealed). You might want to take a look at my StringBuilderPlus Improves Upon StringBuilder article, which makes use of interfaces and implementing those interfaces. The diagram at the bottom of the article shows the interface IString and the two classes, PlainString and StringsWrapper, that implement IString. Download the code if you want to see how that's done.
Shane5555 wrote: inheriting from a class to an interface would be a LOT cleaner
An interface cannot inherit from a class, but a class can inherit from a class. And a class can implement an interface. And an interface can inherit from an interface.
|
|
|
|
|
Shane5555 wrote: would be a LOT cleaner.
No, I'm pretty sure not.
At most you may be looking for duck-typing, but maybe not.
You may need to present your concept better.
|
|
|
|
|
Hi All,
I have some winform apps that heavily object oriently designed. Of course no design documents exist from last developers. In order to gain better insite as to what is going on in the code. Outside of using system.Diagnostics and debug.write, trace.write statements dotted all over the place and checking the stack. What debugging techniques or tips can you advise in order to get up to speed quickly? The code is using all sorts of patterns.. Factory, Provider, Decorator and now I inherited these apps and need to get up to speed quickly. Any little tips or techniques would be appreciated from you Hard Core Developers here. =)
DotNetMan
|
|
|
|
|
If the code has proper comments and descriptive names to files, folders and variables, it would make life a bit easier. You can then scan through files to get a brief idea of what is happening.
If the code too is not well documented, debugging is your friend.
|
|
|
|
|
Run it through the debugger and set breakpoints if required (and conditional breakpoints if required too). That's faster than using debug.write and such.
Draw some diagrams on a whiteboard or some paper to get an idea of how the objects are related.
I have been working with some uncommented SQL stored procedures recently and have been using ErgoNotes (hierarchical notes application) to make a nested description of the code. That might not be as useful for object oriented code (especially if it is loosely linked via interfaces and delegates), but it is one more technique you might use where appropriate.
|
|
|
|
|
aspdotnetdev wrote: Draw some diagrams on a whiteboard or some paper to get an idea of how the objects are related.
You can also let the built-in Class Designer in VS show you all the relationships. Add a new Class Diagram to the project, click and drag all the files onto it and it should automatically add all the classes in those files to the diagram.
Not all the class associations are automatically visible, though. You can download the Modeling PowerToys Add-in[^] to expand on the existing Class Designer's abilities, including showing more types of associations. Once you have this add-in, click on the Class Diagrams menu and select View All Associations , and you should have a decent picture of how all the objects are related.
Obviously this won't show you the general program flow or help with threading issues, but it's definitely a start.
DybsThe shout of progress is not "Eureka!" it's "Strange... that's not what i expected". - peterchen
|
|
|
|
|
DotNetMan wrote: I have some winform apps that heavily object oriently designed.
Heavy use of OO techniques is the way to disaster.
DotNetMan wrote: What debugging techniques or tips can you advise in order to get up to speed quickly?
Attach a debugger to the application. Put lots of break points and see how the program flow goes. If your application uses threads, it makes debugging tricky. Take a look at this[^] MSDN article.Best wishes,
Navaneeth
|
|
|
|
|
Thanks for replying all.
So just to recap. Are we in agreement that the old way of dotting the code with
debug/trace statements is how developers figure out how code works and fix bugs?
DotNetMan
|
|
|
|
|
Dear All,
I have windows service build in c# and it does some actions.
it has got a single method which prints text and this method is called from different classes.
now i want to print all the messages as they are printed, in Windows Application.
I can print these messages into EventLog or in Console.WriteLine(string msg)
any ideas how to capture all these message as the are printed into a windows application (WinForm)?Abdul Rahaman Hamidy
Database Developer
Kabul, Afghanistan
|
|
|
|
|
This[^] should probably help.
|
|
|
|
|
Thanks for the reply, link show how to store output or messages to EventLog. but i want how retreive those messages which i am printing in that method.
this I have seen in Sql Sever Agent. as I think SQL SERVER Agent is a service and you can see the messages or the outputs in SQL SERVER Synchronization "Replication" Status.
I want just the same thing to perform in C#. Like i have a service build in C# and when ever a message is printed that should be shown in Winform Application.Abdul Rahaman Hamidy
Database Developer
Kabul, Afghanistan
|
|
|
|
|
Hi all. I have a client-server distributed system. I want to transfer and image from the server to the client. In the server i have converted a .bmp image to byte array as this:
Image imageIn = Image.FromFile("me.bmp") ;
MemoryStream msr = new MemoryStream();
imageIn.Save(msr, System.Drawing.Imaging.ImageFormat.Gif);
byte[] byteIm = msr.ToArray();
ms.Send(byteIm);
The bytes are being transfered okay to the client. The problem is that i don't know how to assemble this byte back to an image to show in a picture box.
That is:
pictureBox1.Image =
Wamuti: Any man can be an island, but islands to need water around them!
Edmund Burke: No one could make a greater mistake than he who did nothing because he could do only a little.
|
|
|
|
|
have a look at this[^] You should never use standby on an elephant. It always crashes when you lift the ears. - Mark Wallace
C/C++ (I dont see a huge difference between them, and the 'benefits' of C++ are questionable, who needs inheritance when you have copy and paste) - fat_boy
|
|
|
|
|
Actually that is where i knew how to convert and image to bytes but the function returning an Image, how will the pictureBox get the URL? Wamuti: Any man can be an island, but islands to need water around them!
Edmund Burke: No one could make a greater mistake than he who did nothing because he could do only a little.
|
|
|
|
|
Why would the picture box want a URL? Just give it the image, or save it to disk and then give it the url as the file location.
From your original code:
MemoryStream ms = new MemoryStream(byteArrayIn);
pictureBox1.Image = Image.FromStream(ms);
You should never use standby on an elephant. It always crashes when you lift the ears. - Mark Wallace
C/C++ (I dont see a huge difference between them, and the 'benefits' of C++ are questionable, who needs inheritance when you have copy and paste) - fat_boy
|
|
|
|
|
Here you go:
MemoryStream memStream = new MemoryStream(imageBytes);
Image image = Image.FromStream(memStream);
|
|
|
|
|
Thanks guys. It worked. Wamuti: Any man can be an island, but islands to need water around them!
Edmund Burke: No one could make a greater mistake than he who did nothing because he could do only a little.
|
|
|
|
|
try following code:
private void Button2_Click(object sender, System.EventArgs e)
{
connection.Open();
SqlCommand command1 = new SqlCommand("select imgfile from myimages where imgname=@param", connection);
SqlParameter myparam = command1.Parameters.Add("@param", SqlDbType.NVarChar, 30);
myparam.Value = txtimgname.Text;
byte[] img = (byte[])command1.ExecuteScalar();
MemoryStream str = new MemoryStream();
str.Write(img, 0, img.Length);
Bitmap bit = new Bitmap(str);
Response.ContentType = "image/jpeg";//or you can select your imagetype from database or directly write it here
bit.Save(Response.OutputStream, ImageFormat.Jpeg);
connection.Close();
}
change your database name, field name, image name, attribute name.
If You Get your answer then please Rating me...
Thanks..
"Are You Ready"
DX-ARMY
|
|
|
|