Позвольте следующие интерфейсы:
interface IFoo
{
void Foo();
}
interface IBar
{
void Bar();
}
interface IFooBar : IFoo, IBar
{
// No extra required feature.
}
И класс:
class Booh : IFoo, IBar
{
public void Foo() { }
public void Bar() { }
}
Я не могу использовать Booh
как IFooBar
, несмотря на то, что Booh
реализует все, что требуетсяIFooBar
, потому что он официально не реализует его.
Чтобы разрешить использование Booh
в качестве IFooBar
без изменения Booh
на class Booh : IFooBar
, я подумал (основываясь наеще один вопрос) о написании оболочки:
class FooBar<T> : IFooBar where T : IFoo, IBar
{
public T Value { get; private set; }
public FooBar(T value)
{
Value = value;
}
public void Foo() { Value.Foo(); }
public void Bar() { Value.Bar(); }
}
Проблема в том, что я могу использовать все как есть!
Например, если я использую этот класс оболочки как ключ словаря,он будет использовать ссылку на оболочку вместо ссылки на обернутый объект.
Если я сделаю: someDictionary.Add(new FooBar<Booh>(someBooh), whatever);
, а затем someDictionary.Remove<Booh>(new FooBar(someBooh));
, он не удалит Booh
, который я добавил в первую очередь,потому что я создал две разные оболочки, каждый из которых имеет свой собственный адрес.
Чтобы обойти это, я переопределил / реализовал некоторые методы для проверки равенства и хэш-кодов:
class FooBar<T> : IFooBar where T : IFoo, IBar
{
// Same as above...
public bool Equals(FooBar<T> other)
{
return Value.Equals(other.Value);
}
public override bool Equals(object obj)
{
var cast = obj as FooBar<T>;
if (null != obj && null == cast || obj == null)
{
return false;
}
return Value.Equals(cast.Value);
}
public override int GetHashCode()
{
return Value.GetHashCode();
}
}
Этопредположительно вызывает использование ссылки на завернутый объект by словари, я еще не тестировал.
Итак, мой вопрос: Есть ли другие методы, которые мне нужно переопределить и / или реализовать, чтобы охватить большинство (если не все)случаи применения ?Я хочу, чтобы эта оболочка вела себя так, как будто это был сам объект, а не другой объект.Спасибо!
РЕДАКТИРОВАТЬ: Может быть, я мог бы вместо этого сделать это структурой и полагаться на автобокс, чтобы обернуть структуру-обертку в объект, который делегирует ее хэш-код и методы проверки равенстваструктура и, следовательно, использовать ссылку на завернутый объект?