이 내 자신의 질문에 대한 솔루션의 확장 방법에 대한 자세한 내용을 읽을 수 있습니다. 나는 처음부터 내가 무엇을 성취하려고 노력했는지 분명하지 않다는 것을 인정해야한다. 이것은 초기 게시물 편집에서 분명하다. 첫 번째 코드 예제는이 사이트에서 다른 사람이 게시 한 유사한 질문에 대한 답변입니다. 본질적으로 매우 일반적이지만,이 개체가 동일한 개체 유형을 반환하여 메서드를 연결할 수 있음을 옹호하려고 시도하고 있음을 분명히 알 수 있습니다. Zoran Horvat가 "C# 코드를 객체 지향적으로 만들기"라는 튜토리얼을 본 후에 비슷한 것을 완성하고 싶었습니다. 이 자습서는 Pluralsight에서 사용할 수 있습니다. 그의 예제는 4 장과 5 장에서 인터페이스와 확장 메소드를 사용합니다.이 솔루션에 대한 아이디어는 다소 비슷하지만이 기능을 단일 클래스에 포함시키고 자했습니다.
전 혼란이 체인 기능을 제공하기 위해 반환해야하는 객체의 유형과 관련이 있다고 생각합니다. 간단한 문자열 예제를 살펴 보겠습니다.
someString.ToUpper.ToLower.트림
우리의 마음에 가장 먼저 오는 것은 문자열이 한 메서드에서 다른 메서드로 전달되고 각 단계에서 해당 메서드로 수정된다는 것입니다. 따라서 우리는 콜렉션을 사용하여 작업 할 때도 비슷한 상황이 발생합니다.
movies.GetByYear (1999) .GetByGroup (1) .GetByGenre ('액션') 우리는 방법이 체인을 통해 전달되는 일부에서 시작 이때
. 또한이 체인의 모든 메소드가 동일한 List에서 작동한다고 생각할 가능성이 큽니다. 결국 이전 예제의 string 속성은 수정되는 경우에도 모든 메서드간에 공유됩니다. 이 영화 컬렉션에서 실제로 발생하는 것은 아닙니다. 각 메서드는 크기가 다른 컬렉션에서 작동합니다. GetByYear()와 GetByGroup()은 같은 영화 목록에서 작동하는 메서드 인 것으로 보입니다. 실제로 완전히 다른 목록을 가진 별도의 라이브러리 객체입니다.
도서관 개체 반환에 대한 의견을 남긴 Sokohavi에게 감사드립니다. 그는 또한 Library 객체를 IEnumerable로 만들 것을 제안합니다. 불행히도, 메서드가 IEnumerable을 반환해야한다고 생각하는 경우 잘못된 경로에있는 것보다. 엄밀히 말하면 라이브러리는 목록이지만 Movie 객체를 포함하는 목록은 비공개로 설정되며 다른 객체에는 표시되지 않습니다. 따라서 반복 할 내용이 없습니다. 라이브러리 객체에는 몇 가지 메소드 만 있고, 그 중 하나를 선택하면 같은 클래스의 다른 메소드에 액세스 할 수 없게됩니다. 따라서 동일한 클래스의 모든 메소드에 액세스하려면 메소드가 Library 객체를 반환해야하며 Movie 객체를 저장하는 목록은 IEnumerable이어야합니다. 이 접근법에는 한 가지 단점이 있습니다. 라이브러리 생성자 내에서이 목록에 데이터를로드 할 수 없습니다. 대신 데이터는 매개 변수로 전달됩니다. 이제 서로 다른 영화 목록을 가진 객체가 있고 서로 통신하는 방식은 생성자를 통해 이루어집니다.
아래에는 개별 항목을 해당 생성자를 통해 목록에로드하는 Repository 클래스가 있습니다. Library 클래스는 전달 된 목록의 필터링을 제공 할 메서드를 정의합니다. 또한 해당 기능을 사용하는 다른 추상화 계층을 작성할 수도 있습니다.
public class Movie
{
public string Title { get; set; }
public int Year { get; set; }
public int GroupId { get; set; }
public string Genre { get; set; }
}
public class Repository
{
private List<Movie> localDb;
public Repository()
{
localDb = new List<Movie>();
}
public IEnumerable<Movie> GetAllMovies()
{
localDb = new List<Movie>();
var movie1 = new Movie() { Title = "Movie1", Year = 2000, GroupId = 1, Genre = "Action" };
var movie2 = new Movie() { Title = "Movie2", Year = 1999, GroupId = 1, Genre = "Drama" };
var movie3 = new Movie() { Title = "Movie3", Year = 2000, GroupId = 1, Genre = "Comedy" };
var movie4 = new Movie() { Title = "Movie4", Year = 2000, GroupId = 2, Genre = "Action" };
var movie5 = new Movie() { Title = "Movie5", Year = 1999, GroupId = 2, Genre = "Drama" };
var movie6 = new Movie() { Title = "Movie6", Year = 1999, GroupId = 2, Genre = "Drama" };
var movie7 = new Movie() { Title = "Movie7", Year = 1999, GroupId = 2, Genre = "Horror" };
localDb.Add(movie1);
localDb.Add(movie2);
localDb.Add(movie3);
localDb.Add(movie4);
localDb.Add(movie5);
localDb.Add(movie6);
localDb.Add(movie7);
return localDb;
}
}
public class Library
{
private IEnumerable<Movie> MoviesLibrary;
public Library(IEnumerable<Movie> movies)
{
this.MoviesLibrary = movies.ToList();
}
public Library GetByYear(int year)
{
return new Library(this.MoviesLibrary.Where(movie => movie.Year == year));
}
public Library GetById(int id)
{
return new Library(this.MoviesLibrary.Where(movie => movie.GroupId == id));
}
public IEnumerable<Movie> GetByGenre(string genre)
{
return this.MoviesLibrary.Where(movie => movie.Genre == genre);
}
public void Display()
{
foreach (var movie in this.MoviesLibrary)
{
Console.WriteLine("Title: {0} , Year {1}, Group: {2}, Genre: {3}", movie.Title,movie.Year,movie.GroupId, movie.Genre);
}
}
}
이러한 클래스를 사용하는 방법 :
var repository = new Repository();
var listOfMovies = repository.GetAllMovies();
var movies = new Library(listOfMovies);
var selectedMovies1 = movies.GetByYear(2000).GetById(1).GetByGenre("Action");
var selectedMovies2 = movies.GetByYear(2000).GetById(2);
foreach (var movie in selectedMovies1)
{
Console.WriteLine("Selected 1 - Title: {0} , Year {1}, Group: {2}, Genre: {3}", movie.Title,movie.Year,movie.GroupId, movie.Genre);
}
selectedMovies2.Display();
출력 :
선정 1 - 제목 : 극장 1, 2000 년, 그룹 1, 장르 : 액션
제목 : Movie4 , 2000 년, 그룹 : 2, 장르 : 액션
['this'] (https://msdn.microsoft.com/en-us/library/dk1507sz.a) spx)는 무엇입니까? –
질문은 매우 혼란 스럽지만 "방법 연쇄"를 원하는 것처럼 들립니다. - http://stackoverflow.com/questions/1119799/method-chaining-in-c-sharp –
내 첫 글을 편집했습니다. – tipitoe