이런 C# 코드가 있다고 해보자




직렬화를 하는 인터페이스를 만들고 A가 이걸 구현했다


잘 돌아가고 다른 B같은 타입도 이 인터페이스를 구현하면 될테니 아주 좋다



하지만 여기서 다른 인터페이스를 생각해보자





새로운 직렬화 인터페이스 IStreamSerializable이 생겼고 이 타입을 받는 Foo에는 더이상 A를 넣을수 없다


그럼 기존 ISerializable을 재활용하려면 어떻게 해야할까?





뭐긴 뭐야 래핑이지


이제 IAsyncSerializable IStringSerializable등등이 나올때마다 래핑해주면 된다 아주 좋다




이번엔 trait의 솔루션을 알아보자





여기까진 위의 인터페이스와 다를바가 없어보인다



그럼 새로운 trait를 어떻게 대응할까?





Rust에선 임의의 제네릭 타입에 대해서 trait를 구현할수있다





이렇게하면 A는 StreamSerializable를 구현하지 않았지만 Serializable는 구현했기때문에 자동으로 StreamSerializable를 구현하게 된다


같은 방식으로 AsyncSerializable등등으로 확장할수있고 실제로 러스트의 비동기 라이브러리 tokio는 이런식으로 기존 trait들을 래핑없이 비동기로 확장해놨다