people rarely recognize things as type system problems because they aren't used to thinking in those terms; the crux of it is he has an object Person with an Addresses property, but he wants to inherit from Person with American and make Addresses no longer be an Address[] but be an AmericanAddress[]
problem is Addresses is defined in Person so American can't change it's type (AmericanAddress maybe adds the State property)
Solution: Generics. class Person<T> where T : Address { T[] Addresses { get; set; } } and then class American : Person<AmericanAddress> { ... }
and there is no longer a JapanesePerson or AmericanPerson at all, just a Person<T> and some "normal" inheritance from Address to WhateverAddress, right?
It's generally bad design, but that's the problem and solution.
@Ixrec no, there's JapanesePerson which implements Person<JapaneseAddress> and AmericanPerson implements Person<AmericanAddress> so that the base class has a property T[] Addresses which can have it's type selected by those derived classes