2017-03-21 3 views
0

Ich habe zwei Schnittstellen. Ich möchte sie für Liste und für Array verwenden.Zwei Generika und unendlich

public interface IBook<T> 
{ 
    string Name { get; set; } 
    T Authors { get; set; } 
    int PagesCount { get; set; } 
} 

public interface IAuthor<T> 
{ 
    string Name { get; set; } 
    T Books { get; set; } 
} 

class Author<T> : IAuthor<IBook<T>[]> 
    where T : IAuthor<IBook<T>[]> 
{ 
    public string Name { get; set; } 
    public IBook<T>[] Books { get; set; } 

} 
class Book<T> : IBook<IAuthor<T>[]> 
    where T : IBook<IAuthor<T>[]> 
{ 
    public string Name { get; set; } 
    public IAuthor<T>[] Authors { get; set; } 
    public int PagesCount { get; set; } 

    public static void Main(string[] args) 
    { 
     Author<IBook<IAuthor<...>[]>[]> a = new Author<>(); 
    } 
} 

Gibt es eine Möglichkeit, ein Objekt wie dieses in main zu erstellen. Der Compiler sagt, dass in der Beschreibung der Schnittstellen und Klassen keine Fehler enthalten sind. Bitte hilf mir.

+0

Ich verstehe Ihre Frage nicht, können Sie nicht nur instanziiert sie als Objekte oder eine Liste? –

+1

Warum wollen/müssen Sie Generika hier verwenden? Auch warum sind 'Bücher' und' Autoren' ein 'T' anstelle von' T [] '? Diese Namen sind schließlich Plural. –

+1

Erstellen Sie IBookCollection und IAuthorCollection, die IEnumerable implementiert und verwenden Sie es wie folgt: IAuthor MistyK

Antwort

3

Persönlich denke ich, dass Sie hier generische Generatoren überbeanspruchen und dies ein bisschen komplexer als es ist.

Bewerten Sie Ihre Kriterien:

Autor (ein -> viele) Buchen
Book (ein -> viele) Autor

Sie können dies tun, indem Sie die folgenden Klassen mit:

public class Book 
{ 
    public string Name { get; set; } 
    public Author[] Authors { get; set; } 
    public int PageCount { get; set; } 
} 

public class Author 
{ 
    public string Name { get; set; } 
    public Book[] Books { get; set; } 
} 

Wenn Sie es so machen, können Sie Ihr Leben ein wenig erleichtern, indem Sie alle Bücher und Autoren innerhalb einer Elternklasse enthalten und linq Abfragen verwenden, um zu identifizieren, welches Objekt a Buch/Autor bezieht sich auf:

public class BookStore 
{ 
    public List<Book> Books { get; set; } 
    public List<Author> Authors { get; set; } 

    public Book GetBook(string name) 
    { 
     var query = Books.Where(b => b.Name.Equals(name)); 
     if (query.Count() == 1) 
      return query.ElementAt(0); 
     else return null; 
    } 

    public Author GetAuthor(string name) 
    { 
     var query = Authors.Where(a => a.Name.Equals(name)); 
     if (query.Count() == 1) 
      return query.ElementAt(0); 
     else return null; 
    } 
} 
1

Es wäre auf jeden Fall besser für Sie, wenn Sie nicht generische Klassen wie diese nicht verwenden, führen dies ein Schmerz im Nacken jedes Mal, wenn Sie versuchen, ein Objekt zu initialisieren. Zumindest machen Sie eine Standardimplementierung für die generische Klasse, für die kein Autorentyp benötigt wird. Sie sollten auf jeden Fall eine Art von Strategie für Ihre Anwendung implementieren, die davon abhängt, wie skalierbar es sein sollte und einfach zu pflegen ist. Und @Nathangrad hat Ihnen ein großartiges Beispiel gegeben.

Ich denke, Ihre Objekte in etwa so aussehen sollte, wo Ihr Buch Autoren sind nicht offen und direkt und Autoren Bücher geändert werden:

public interface IBook 
{ 
    string Name { get; set; } 

    ICollection<IAuthor> GetAuthors(); 

    void AddAuthor(IAuthor book); 

    int PagesCount { get; set; } 
} 

public interface IAuthor 
{ 
    string Name { get; set; } 

    ICollection<IBook> GetBooks(); 

    void AddBook(IBook book); 
} 

public class Author : IAuthor 
{ 
    private ICollection<IBook> books; 

    public Author() 
    { 
     this.books = new HashSet<IBook>(); 
    } 


    public Author(ICollection<IBook> books) 
    { 
     this.books = books; 
    } 

    public string Name { get; set; } 

    public void AddBook(IBook book) 
    { 
     this.books.Add(book); 
    } 

    public ICollection<IBook> GetBooks() 
    { 
     return this.books; 
    } 
} 

public class Book : IBook 
{ 

    private ICollection<IAuthor> authors; 

    public Book() 
    { 
     this.authors = new HashSet<IAuthor>(); 
    } 

    public Book(ICollection<IAuthor> Authors) 
    { 
     this.authors = Authors; 
    } 

    public void AddAuthor(IAuthor author) 
    { 
     this.authors.Add(author); 
    } 

    public ICollection<IAuthor> GetAuthors() 
    { 
     return this.authors; 
    } 

    public string Name { get; set; } 

    public int PagesCount { get; set; } 
}