C#과 같은 양호하지만 다중 상속 절단 언어로 "마샬 비어 포버"를 해결하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/313243

문제

C#과 같은 양호하지만 다중 상속 절단 언어로 "마샬 비어 포버가되어야하는 방법"을 해결하는 방법은 무엇입니까?

문제는 매우 간단합니다. 여러 경우 에이 클래스 (인프라 요구 사항)에서 상속해야합니다. 여기서 실제로는 중요하지 않습니다. 그렇다면 다른 클래스 (도메인 모델 요구 사항)에서 이미 상속 된 경우 어떻게합니까?

Spring.net과 같은 BTW 좋은 응용 프로그램 프레임 워크는 항상 클래스에 어떤 종류의 인프라를 적용해야하든 항상이 클래스에서 상속받을 필요가 없습니다.

여기서 -3 표를 얻는 것이 무엇인지 알고 싶습니다. :)

도움이 되었습니까?

해결책

일반적으로 원격 / WCF 컨텍스트에서 사용하려면 객체 마샬 비어프 만 만들고 싶습니다. 이것은 일반적으로 고통이 아니라는 특별한 경우입니다.

일반적인 유형이 있다고 가정 해보고 그것을 전문화하고 전문화 한 다음 파생 된 유형을 멀리 떨어 뜨리고 싶었습니다. 이제 객체를 원격으로 만들려면 MarshalByRefoBject에서 상속되어야하며 원래 일반 유형은 그렇지 않았습니다. . 이진 상속을하고 있거나 기본 클래스에서 파생되기 때문에 변경할 수 없다고 가정 하시겠습니까? 질문자가 지적했듯이 C# (및 .NET)은 MI를 허용하지 않으므로 두 가지를 상속받을 수 없습니다.

짧은 대답은 당신이 일종의 나사가 있다는 것입니다. 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();
    }
}

그래도 많은 일처럼 보입니다. 궁극적 으로이 시나리오에 있다면 재 설계 또는 재고를 제안합니다.

다른 팁

그것은 당신이 그것을 어떻게 가져 가야하는지에 달려 있습니다. MarshalbyRefoBject에서 파생되는 기본 클래스를 사용하면 그렇게 할 수 있습니다. 집계가 그렇게 할 수 있습니다. 더 구체적인 예가 필요하지 않으면 말하기는 어렵지만 여러 상속이 문제에 대한 유일한 해결책이 될 것입니다.

여러 클래스에서 상속받을 수 없습니다. 따라서 (a) 상속 계층 구조를 변경하여 기본이 상속을 받거나 (b) 응용 프로그램을 다르게 작성해야합니다.

더 많은 정보없이 상속해야합니다 MarshalByRefObject 또는 왜 기본 수업이 할 수 없는가? 그러면 더 구체적인 조언을하기가 어렵습니다.

그러나 나는 당신이 기지에 다른 마샬링 시맨틱이 필요한 파생 유형을 가지고 있다면 어딘가에 건축 문제가있을 것입니다.

"그래서 다른 클래스 (도메인 모델 요구 사항)에서 이미 상속된다면 어떻게합니까?"

MarshalbyRefobject의 상속이 필요한 도메인 모델의 기본 클래스를 만들 수 있습니까?

나는 일반적인 접근 방식으로 성공했다. t는 "MarshalbyRefobject"일 필요는 없습니다. 물론 "Remoteprocess"를 원격 객체로 교체해야합니다. 그런 다음 remotinghost.remoTeObject로 비 마셔 비 레피브 jection에 액세스 할 수 있습니다.

public class RemotingHost<T> : MarshalByRefObject where T: class
{
    RemoteProcess host;
    T remoteObject;
    public T RemoteObject { get { return remoteObject; } }

    public RemotingAdmin()
    {
        host = new RemoteProcess();
        remoteObject = (T)host.CreateObject(typeof(T));
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top