|
Is there a plus in this design with respect my one?
|
|
|
|
|
Strictly talking from a designs standpoint - Yes there is.
You see when we have an interface we are saying that we are defining a contract and all the classes implementing this interface should implement this contract i.e. methods. We cannot then say that we need to selectively implement the methods.
The abstract class says that, I am providing a default implementation and the derived class is free to have his own IF it needs to.
So in your case you needed some functions to be implemented selectively and some mandatory so following the design principle, I moved the mandatory ones in the contract i.e. the interface and the optional ones in abstract class. and in this particular case the default implementation of optional methods is to do nothing.
I hope i am able to convey my thoughts clearly. Do let me know if not. I am also open to counter arguments as they will only enhance my learning. (counter arguments == brainstorming) i.e. always beneficial
Every now and then say, "What the Elephant." "What the Elephant" gives you freedom. Freedom brings opportunity. Opportunity makes your future.
|
|
|
|
|
TheGermoz wrote: class A can implements I1 or I2 depending on how it is constructed
This is a dead giveaway for poor design. Inheritance hierarchies are telling you what operations you can do on an object, and you should be able to tell from the type of something what you can do with it. That is, an instance of A should always be treatable as an I2, or never.
What you almost certainly want to do is:
interface I1 {
void A();
void B();
}
interface I2 : I1 {
void C();
void D();
}
class A : I1 {
public virtual void A() {}
public virtual void B() {}
}
class A2 : A, I2 {
public void C() {}
public void D() {}
public override void A() {
base.A();
}
}
|
|
|
|
|
yes this is my degign I propose, I was wandering if it is ok
|
|
|
|
|
This is good. +5.
P.S. We might do away with the interface containing the optional functions as these are not a part of the contract. Also we can make class A as abstract to make sure no one is able to create it directly as its only purpose is to facilitate default implementation for optional functions.
I tried to do this design this way. I would love to hear your opinion on it:
http://www.codeproject.com/Messages/4429095/Re-Design-Question.aspx[^]
Every now and then say, "What the Elephant." "What the Elephant" gives you freedom. Freedom brings opportunity. Opportunity makes your future.
|
|
|
|
|
Since we don't know what the interfaces or the class 'A' represent we can't be sure what the contracts needed are. But as the question has two interfaces in it, it seems likely that he needs both, and publicly instantiable classes that implement each.
Rahul Rajat Singh wrote: Also we can make class A as abstract to make sure no one is able to create it directly as its only purpose is to facilitate default implementation for optional functions.
I don't think that's true. The original question suggests that it is possible to construct an A which is fully functional but only supports the I1 operations, and that it's also possible to construct an A which additionally implements I2. That means you need a concrete class and a concrete subclass.
|
|
|
|
|
Is there a reason why you are using interfaces? Too many .NET programmers make the mistake of thinking they need to use interfaces everywhere. Just like any other technology/construct/etc., you should only use interfaces when appropriate.
Is anybody using your class external to your app?
Based on the information you provided in your post, your design should be:
class A
{
virtual void a();
virtual void b();
}
class B : A
{
virtual void c();
virtual void d();
}
why over complicate? KISS.
|
|
|
|
|
Yes really there is a reason, the example was a very simplify version of may real problem. Anyway I appreciate your answer
|
|
|
|
|
Make interface I1 an abstract class instead (A1) or just create the class, whichever makes more sense, and inherit from A1 when you implement I2. Probably no reason to have the interface and the base class A1
|
|
|
|
|
Yesterday I had one form inside another and was told to use background working thred to solve a problem. I was wondering if I might also need a background thread for another project (meaning library, not part of the main program). This other project handles nothing but analysis and will calculate many millions of algorithms a minute. Does this have its own thread or should I set this up in a background thread as well.
I appreciate any help.
Thanks in advance.
|
|
|
|
|
If it's not already using threading for the calculations and if the calculations may take some time, then it would probably be a good idea. If the calculations are quick, even if there are a lot of them, then it may not be needed IMO.
|
|
|
|
|
Here's what I've got:
public struct ItmAray
{
public string FieldName;
public int FieldIndex;
}
public struct dtlst
{
public ItmAray[] ItemArray = new ItmAray[128];
}
public dtlst[] DataList = new dtlst[128];
This is what I want:
DataList[x].ItemArray[y].FieldName = clbText;
DataList[x].ItemArray[y].FieldIndex = int.Parse(a);
This is what I'm getting:
an error: "cannot have instance field initializers in structs" from the dtlst structure:
public ItmAray[] ItemArray = new ItmAray[128];
I believe the problem is the righthand side of the line.
But I can't figure out how to fix it.
Thanks!
|
|
|
|
|
KKW_acd wrote: righthand side of the line
You are correct. As the message says, you cannot initialize a field when it is first declared in a struct, all fields assume the default value for the type which in the case of an array is null. Initialization must be done in a constructor (however you cannot have a parameterless constructor for a struct either).
When to use a struct or a class can be complicated sometimes. I think your dtlst (horrible name by the way - why not DataList ?) should most likely be a class. You will then be able to initialize the field as you wish.
Also, public fields are normally bad practice, make them private and use a property (getter only unless a setter is needed) to expose the field.
Edit: There's still a few things about this that don't feel right, but to fit your code and usage, this is a quick example of something that works. This is not meant to be doing your homework for you, but rather to point you in the correct direction and give you something to compare your code too:
public struct Item
{
private string name;
private int index;
public Item(string name, int index)
{
this.name = name;
this.index = index;
}
public string Name { get { return name; } }
public int Index { get { return index; } }
}
public class DataList
{
private Item[] items = new Item[128];
public Item[] Items { get { return items; } }
}
DataList[] dataLists = new DataList[128];
int listIndex = 0;
int itemIndex = 0;
string itemText = "Random text";
string indexText = "1";
dataLists[listIndex] = new DataList();
dataLists[listIndex].Items[itemIndex] = new Item(itemText, int.Parse(indexText));
modified 15-Nov-12 13:19pm.
|
|
|
|
|
Dave,
Thankyou!
That is exactly what I needed!
Also, I'm flattered that you think this is homework! I wish I was as young. I'm an old bit-twiddler from the DOS and Microprocessor days. I even remember watching man's first step on the moon on an Admiral B&W tv! - Live!
Thanks again!
|
|
|
|
|
No problem.
KKW_acd wrote: I wish I was as young
Ah, sorry!
KKW_acd wrote: old bit-twiddler from the DOS and Microprocessor days
Then, once you get used to C# you will find this a lot of fun, and in many ways, a lot easier. Gone are the days where variables and function names need to be short and cryptic, we can be alot more verbose now e.g. A date and time combined is a DateTime not dtm . We have a powerful framework that has the vast majority of the dirty/hard work done for us. Allocating and freeing memory is taken care of (in most situations), threading, callbacks etc are a breeze compared to the old days. Many, many other things too.
It still of course requires the same skills and dedication/perseverance but the curve is somewhat shallower.
|
|
|
|
|
KKW_acd wrote: I even remember watching man's first step on the moon on an Admiral B&W tv! - Live! Me too, although a different TV model.
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
In your dtlst structure you cannot initialise the instance variable ItemArray automatically, as struct s do not have default (parameterless) constructors. You would need to initialize the variable after you have created the struct (s), i.e after you create the DataList array.
It is explained more clearly here[^].
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
The immediate error is what's in the message.
However, I suspect you didn't mean to create a struct here. A struct in C# is a value type, so wherever it is passed to a method, a copy is taken, and the initial version is not modifiable. However, the array within the struct will be modifiable and the array in the outside version of the struct will be updated! A struct containing references to reference types, like an array, is usually not what you meant to do.
I think you are trying to recreate the C++
typedef struct {
string FieldName;
int FieldIndex;
} ItmAray;
typedef struct {
ItmAray[128] ItemArray;
} DtLst;
DtLst[128] DataList;
But the arrays there are references: DtLst[100] is a reference to a DtLst, and passing it to a function will pass it by reference. In C# I think you want a class.
Also, fixed length arrays are generally not what you want in the modern world. I think what you actually want is
class Field {
string Name;
int Index;
}
class DataListItem {
List<Field> Fields;
}
List<DataListItem> DataList;
|
|
|
|
|
i want to automate a c# application with windchill can anyone guide me from where i should start??
|
|
|
|
|
"windchill" is a calculation so there is no automation for it.
On the other hand if you want to collect weather conditions from a weather station and persist those values and/or display them then that might fit the automation part. If so then you need to do the following
- Research how weather stations intereface (not a C# term) with computers.
- Decide which interfaces you want to implement.
- Investigage how the protocol of the select interfaces are used in C#. This would probably be TCP/IP and/or USB.
- Put the above together to write your application.
If that doesn't describe what you want then you will need to re-phrase your question.
|
|
|
|
|
i am sorry for the confusion actually Windchill PDMLink – A web-based master product data management repository that also helps teams manage critical processes such as change/configuration management, and detailed design. its a software application so i want an automation with it..
|
|
|
|
|
Still isn't clear.
Does that product offer an automation feature that you want to access?
Or do you want use the features of the system in some way via your application?
If the second then
1. Investigate the API(s) that the product exposes
2. Define exactly what it is that you want to do with that product (this is not code.)
3. Write a message layer that interacts with the API (from 1) in such a way that is provides sufficient functionality for 2 but does not necessarily implement 2.
4. Write a functional layer using 3 that implements the functionality defined in 2 via 3.
The distinction between 3 and 4 can be somewhat fuzzy even to the extent that it makes more sense for 3/4 to be one layer. However that depends on 2.
|
|
|
|
|
jschell
yes i want to do the second option and i am searching for API(s) and the purpose of this thread was just to get idea from someone who worked on it so he or she can guide me about API(s) and other features and loop holes.
anyhow thank you so much for replying if is there anyone you know who has some experience about windchill send kindly refer me
|
|
|
|
|
I setup a form (subform) inside another form (mainform)at runtime. While some methods are being executed, the data in this subform also gets updated. However, I can not do anything else in the mainform. I have also tried setting the subform up as a control but I have the same problem. Is there a way I can access the mainform while the subform is updating.
Any help will be greatly appreciated,
Thanks in advance,
Michael
|
|
|
|
|
I presume the process going on in the subform is reading from the database or some other long running process. This long running process needs to be separated onto another thread (backgroundworker thread is a good place to start.) This allow the UI on the main thread to respond.
Never underestimate the power of human stupidity
RAH
|
|
|
|