2010-11-19 7 views
5

Wystąpił taki problem konstrukcyjny.Jaki jest najlepszy projekt, którego mogę użyć do zdefiniowania metod o tej samej nazwie?

Załóżmy, że masz zestaw klas, który implementuje podobne metody, ale nie identyczne.

Przykład: Klasa A ma takie metody.

void Add(string str); 
void Delete(string str); 
List<string> GetInfo(string name); 

Kolejna klasa, ClassB, ma następujące metody.

void Add(Dictionary Info); 
void Delete(string str); 
Dictionary GetInfo(string name); 

więc charakter metod są podobne, ale typy RETURN/parametry wejściowe są różne. Jeśli opracuję interfejs, aby zachować spójność, mogę zdefiniować tam tylko operację Delete. Alternatywnie mogę myśleć o zestawie niezależnej klasy bez żadnych wzajemnych relacji (oczywiście bez implementacji interfejsu), ale nie sądzę, że jest to dobry projekt.

  1. Jakie podejście mogę zastosować, aby to wdrożyć?
  2. Jestem nowy w interfejsy ogólne. Czy to pomaga w tym przypadku? Jeśli tak, zamierzam się uczyć i stosować je w praktyce.
+1

W jakim stosunku (programowo i pojęciowo) wykonaj klas A i B stoją? –

+0

Wykonują operacje na podobnych obiektach. W perspektywie sharepoint można go uznać za SPList i SPWeb. Obie reprezentują elementy treści, mają prawie takie same operacje, ale wejścia/wyjścia mogą się różnić. Potrzebujemy więc dobrego sposobu na zdefiniowanie "struktury", ale nadal nie możemy tego zrobić ze względu na różnice typu parametru. –

Odpowiedz

8

Można użyć rodzajowy interfejs tutaj. Przykład:

interface IModifiable<T> 
{ 
    void Add(T Info); 
    void Delete(T item); 
    T GetInfo(string name); 
} 
public class MyClass : IModifiable<List<string>> 
{ 
    public void Add(List<string> list) 
    { 
     //do something 
    } 

    public void Delete(List<string> item) { } 
    public List<string> GetInfo(string name) { } 
} 
1
public interface IInt<T> { 
    void Add(T val); 
    void Delete(string str); 
    T GetInfo(string name); 
} 
3

Generics by pomóc, jeśli możesz zmienić swój projekt lekko:

interface IFoo<TKey, TValue> 
{ 
    void Add(TKey name, TValue value); 
    void Delete(TKey name); 
    IEnumerable<TValue> GetInfo(TKey name); 
} 

nie całkiem pasowały do ​​przykładów, ale niewiele brakowało. Jeśli nie możesz wprowadzić tej zmiany, powiedziałbym, że twoje zajęcia nie są na tyle podobne, aby mieć wspólny interfejs.

Należy również zauważyć, że ten wzór jest bardzo podobny do interfejsu IDictonary lub ILookup. Być może możesz użyć istniejących interfejsów zamiast tworzyć nowe.

0

Problem jest dość vaugely zdefiniowane, ale z tego co rozumiem Masz kilka możliwości najpierw użyć definicji metoda rodzajowa

public void Detele<T>(T toDelete); //optional : where T 

i zdefiniować go w ogólnym interfejsu (lub klasa abstrakcyjna jeśli it'syour przypadek)

W przeciwnym razie bardzo starą, ale wciąż dźwiękową techniką jest przeciążanie metody. Możesz zdefiniować wiele metod o tej samej nazwie, ale biorąc różne argumenty. .Net używa tego wzorca w takich klasach jak StreamReader, ToString itp.

Od podpisów, które podałeś, wygląda na to, że możesz na to skorzystać.

Trzecia opcja (choć trudniejsza do zakodowania) to użycie wyrażeń lambda.

Add<T,P>(Action<T,P> addingAction, T source, P param) (addingAction(source,param);); 
//this is naive p.Add(q) it can be arbitralily more complicated 
aObject.Add((p,q) => p.Add(q), myObj, myParam); 

W ten sposób definiujesz ogólną akcję dodawania, która może zostać zamknięta w Twoich obiektach. Podpis podany przeze mnie może łatwo ulec zmianie. Poza tym możesz nie chcieć wykonywać tej akcji od razu, ale zaplanuj ją dla leniwego wykonania lub uruchom ją asynchronicznie. Możliwości z wyrażeniami lambda są nieograniczone.

Dostarczyłem także implementację, która korzysta z delegata akcji. Możesz łatwo przekonwertować ten kod, aby użyć klasy Expression, dzięki której możesz budować swoich własnych delegatów podczas wykonywania kodu (i buforować je po inicjalizacji, ponieważ jest to dość powolny proces, tj. Odbicie i inne). Zdecydowanie polecam nadużywać delegatów i wyrażeń kiedy możliwe.

Take care Łukasz

Powiązane problemy