То, как решить, “Должно быть MarshalByRefObject” на ампутированном языке хорошего, но множественного наследования как C#?

То, как я это сделал, было правильно. У меня было несколько синтаксических ошибок, которые нужно было исправить.

17
задан Paul Kapustin 24 November 2008 в 02:05
поделиться

4 ответа

В целом Вы только хотите сделать объектный MarshalByRef, если Вы собираетесь использовать его в Дистанционной работе / контекст WCF. Это обычно - достаточно специальный случай, что это не боль.

предположим у Вас был общий тип, и Вы хотели произойти из него и специализировать его, и затем удаленный производный тип - теперь у Вас есть проблема, потому что, чтобы быть удаленным объект должен наследоваться MarshalByRefObject, и Ваш исходный общий тип не сделал. Предположим, что Вы не можете изменить его, потому что Вы делаете двоичное наследование, или потому что это само происходит из базового класса, который Вы не можете изменить? Как корреспондент указывает, так как C# (и.NET в целом) не позволяет MI, Вы не можете наследоваться от обоих.

короткий ответ - то, что Вы - вид - завинченных. Вы или изменяете общий тип на inhert от MarshalByRefObject (или заходите достаточно далеко цепочка, что можно вставить его где-нибудь эффективный), или иначе можно думать о слонянии без дела с объектами прокси.

Вы могли, например, создать интерфейсный контракт, который описывает интерфейс Вашего типа, и затем создайте тип прокси, наследовавшийся MarshalByRefObject, который также реализует тот интерфейс составом и делегацией экземпляра Вашего типа (т.е. обертка). Вы могли тогда удаленный экземпляр того типа прокси, который инстанцирует Вашего типа и сделает работу как ожидалось - но все типы возврата из методов должны быть [сериализуемыми].

public interface IMyType
{
    string SayHello();
    string BaseTypeMethodIWantToUse();
}

public class MyType : MyBaseType, IMyType
{
    public string SayHello()
    {
        return "Hello!";
    }
}

public class MyRemoteableType : MarshalByRefObject, IMyType
{
    private MyType _instance = new MyType();

    public string SayHello()
    {
        return _instance.SayHello();
    }

    public string BaseTypeMethodIWantToUse()
    {
        return _instance.BaseTypeMethodIWantToUse();
    }
}

Походит на большую работу, все же. В конечном счете, если бы Вы находитесь в этом сценарии, я предложил бы модернизацию или переосмысление.

16
ответ дан 30 November 2019 в 14:01
поделиться

Это зависит от того, как необходимо достигнуть его. Используя базовый класс, который происходит из MarshalByRefObject, мог бы сделать это. Агрегирование могло бы сделать это. Без более конкретного примера того, в чем Вы нуждаетесь, трудно сказать, но это - редкий случай, что множественное наследование было бы единственным решением проблемы.

1
ответ дан 30 November 2019 в 14:01
поделиться

Вы не можете наследоваться нескольким классам. Таким образом, любой необходимо (a) изменить иерархию наследования, таким образом, основа наследовалась ей, или (b) записать приложение по-другому.

Без большей информации [приблизительно 111], почему необходимо наследоваться от MarshalByRefObject или почему базовый класс не делает (не может?) тогда трудно дать больше конкретный совет.

, Но я сказал бы, есть ли у Вас производный тип, для которого нужна различная семантика маршалинга к ее основе, тогда Вы, вероятно, получили архитектурную проблему где-нибудь.

1
ответ дан 30 November 2019 в 14:01
поделиться

"Так, что Вы делаете, если Вы уже наследовались некоторому другому классу (Ваши требования модели предметной области)?"

можно ли создать базовый класс для части модели предметной области, которая требует наследования от MarshalByRefObject?

0
ответ дан 30 November 2019 в 14:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: