假设我有一个带有一些值的枚举类别:
enum Category {
ProgrammingBooks
CookingBooks
}
我希望每个枚举都有自己的枚举,例如:
ProgrammingBooks 将举办:
enum ProgrammingBooks {
CSharp,
Java,
Cpp
}
我看到一个建议的解决方案:
enum Fauna {
enum Type { MAMMAL, BIRD }
TIGER(Type.MAMMAL),
LION(Type.MAMMAL),
PEACOCK(Type.BIRD),
OWL(Type.BIRD);
private final Type type;
Fauna(Type type) { this.type = type; }
}
用法:
Stream.of(Fauna.values()).filter(f -> f.type == BIRD).toList()
但是,我只是一个初学者,我正在寻找一些即使我不知道并且应该学习,也不会对我造成影响的东西。我不明白我提到的例子(我在 StackOverFlow 上找到的)。
使用类或接口(interface)。例如:
public enum Category
{
ProgrammingBooks,
CookingBooks
}
public interface IBook
{
Category BookType { get; set; }
string Title { get; set; }
string Author { get; set; }
// ...
}
public class ProgrammingBook: IBook
{
public ProgrammingBook()
{
this.BookType = Category.ProgrammingBooks;
}
public string Author { get; set; }
public string Title { get; set; }
public Category BookType { get; set; }
// ...
}
public class CookBook : IBook
{
public CookBook()
{
this.BookType = Category.CookingBooks;
}
public string Author { get; set; }
public string Title { get; set; }
public Category BookType { get; set; }
// ...
}
如果你想支持“子类型”,你可以提供只属于特定类而不是接口(interface)的属性,因为不是每本书都是关于编程的。例如:
public enum ProgrammingLanguage
{
CSharp,
Java,
Cpp
}
public class ProgrammingBook: IBook
{
// a constructor that takes the ProgrammingLanguage as argument
public ProgrammingBook(ProgrammingLanguage language)
{
this.BookType = Category.ProgrammingBooks;
this.Language = language;
}
public ProgrammingLanguage Language { get; set; }
public string Author { get; set; }
public string Title { get; set; }
public Category BookType { get; set; }
// ...
}
我为什么要使用接口(interface)?因为所有的书都有一些共同点(例如,它们都有书名和作者)。所以你可以从Polymorphism中获益:
var library = new List<IBook>();
var book1 = new ProgrammingBook(ProgrammingLanguage.CSharp) {Title = "C# in Depth", Author = "Jon Skeet"};
var book2 = new CookBook() { Title = "Everyday Superfood", Author= "Jamie Oliver" };
library.Add(book1);
library.Add(book2);
// now you can loop all and you know that all books have these properties
foreach (IBook book in library)
{
Console.WriteLine("Title: {0} Type: {1}", book.Title, book.BookType.ToString());
}
或者如果您只想获取编程书籍:
foreach (IBook book in library.Where(b => b.BookType == Category.ProgrammingBooks))
{
// ...
}
与 LINQ 的 Enumerable.OfType
方法相同,它只是检查类型:
foreach (IBook book in library.OfType<ProgrammingBook>())
{
// ....
}