首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态方法访问修饰符

动态方法访问修饰符
EN

Stack Overflow用户
提问于 2016-08-09 19:39:11
回答 2查看 445关注 0票数 0

我想根据传入的类型限制对方法的访问。在我的特殊情况下,如果您愿意的话,我正在开发一个UDP“经理”。

我希望我的UDPManager被用于不同的事情。例如,我可能有一个UDPManager用于客户机和服务器之间的通信,另一个UDPManager用于处理服务器和另一个服务器之间的通信。

我定义了一个enum,它指定了UDPManager的类型。比如ManagerType.A = 1和..。ManagerType.B = 2

UDPManager有某些可以订阅的事件,如果这些事件与UDPManager的类型无关,我不希望这些事件可用。

下面是一个类的示例

代码语言:javascript
复制
public class Something
{
    public int SomethingsType { get; set; }
    public void A() { }
    public void B() { }
}

如果是SomethingsType == MessageType.A,那么MessageType.B是不可用的(即它是私有的)。

为进一步明确起见,如果我键入:

代码语言:javascript
复制
Something something = new Something();
someting.SomethingsType = 1

我不希望something.B()可用。

更新

我为提到runtime而道歉。我的意思是,如果said SomethingsTypeA,我不希望said方法(Said method )可用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-09 20:08:09

救援接口:

代码语言:javascript
复制
public interface IUdpManagerA
{
    void A();
}

public interface IUdpManagerB
{
    void B();
}

public class UdpManager : IUdpManagerA, IUdpManagerB
{
    public void A() { }
    public void B() { }             
}

public class UdpManagerFactory
{
     private UdpManager Create() => new UdpManager();
     public IUdpManagerA CreateOfA() => Create();
     public IUdpManagerB CreateOfB() => Create();
}

UdpManagerFactory factory = new UdpManagerFactory();
IUdpManagerA a = factory.CreateOfA();
IUdpManagerB b = factory.CreateOfB();

接口是发布某些成员的强大工具,而其他成员则可以保持隐藏。

虽然您可能会说是,但您可以将IUdpManagerA转换为IUdpManagerB,反之亦然,以获得对隐藏成员的访问,我的回答是**这并不安全,因为没有迹象表明IUdpManagerA也实现了IUdpManagerB,反之亦然。

哦,我忘了提到您应该丢弃ManagerType 枚举,因为在接口中,您总是可以检查给定的实例是 A 还是Be 217

代码语言:javascript
复制
object instance = factory.CreateA();

if(instance is IUdpManagerA)
{
}

if(instance is IUdpManagerB)
{
}

或者使用as操作符:

代码语言:javascript
复制
object instance = factory.CreateA();
IUdpManagerA a = instance as IUdpManagerA;
IUdpManagerB b = instance as IUdpManagerB;

if(a != null)
{
} 
else if(b != null)
{
}
票数 2
EN

Stack Overflow用户

发布于 2016-08-09 19:54:38

这是一个基于enum的工厂构建方法的极端简单版本:

代码语言:javascript
复制
    public enum ManagerType
    {
        A,B
    }

    public abstract class UDPManager
    {

    }

    public class SomethingA : UDPManager
    {
        public void A()
        {}
    }

    public class SomethingB : UDPManager
    {
        public void B()
        {}
    }

    public class UdpManagerFactory
    {
        public UDPManager Build(ManagerType type)
        {
            if (type == ManagerType.A)
                return new SomethingA();

            if(type == ManagerType.B)
                return new SomethingB();

            throw new Exception("type not found");
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38859118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档