Bar - это просто Foo с единственным дополнительным методом, работающим с состоянием, которое уже является общим для обоих объектов.
Это совершенно неважно, будет ли работать каст. Приведение (между ссылочными типами, игнорируя определенные пользователем преобразования) может быть успешно выполнено в .NET, только если объект, на который ссылается , является экземпляром целевого типа или некоторого дочернего типа. Это так просто. Вы можете иметь два класса без любых дополнительных членов:
class Base {}
class Derived : Base {}
... и приведение все равно не удастся, если вы попытаетесь привести к Derived
, когда у вас есть экземпляр Base
:
Base b = new Base();
Derived d = (Derived) b; // Exception
Я хочу, чтобы мой конечный пользователь должен был принять осознанное решение о том, что Foo действительно является Bar, и выполнить приведение, прежде чем он сможет получить доступ к методу BarOp ().
Но объект не на самом деле Bar
, в противном случае приведение будет работать. Ваш план был бы разумным, если бы вы гарантировали, что вы создали фактических Bar
объектов в любое время.
Если вы не пытаетесь добавить какую-либо безопасность во время выполнения, просто заставьте разработчика сказать: «Я действительно хочу это сделать», тогда вы можете написать тип оболочки:
class Bar : IBarOperations
{
// Keep a reference to the existing Foo object
// Expose privileged methods
}
Тогда, если вы хотите использовать свободный стиль, вы можете написать экземпляр или метод расширения для Foo
из AsBar()
, который создает новый Bar
, что приводит к коду:
foo.AsBar().BarOp();
Это все еще поддерживает дополнительную «проверку» (даже при том, что это действительно не подтверждает, что пользователь должен быть в состоянии сделать это), не пытаясь использовать приведение.