限制对方法的访问或为特定对象重写该方法

Posted

技术标签:

【中文标题】限制对方法的访问或为特定对象重写该方法【英文标题】:Restricting Access to a Method or Rewriting that Method for a Specific Object 【发布时间】:2016-03-21 17:33:27 【问题描述】:

(在 C# 程序中)我有一个 List<Author> authors,其中 Author 是我编写的一个类。 Lists 有一个默认的 Add(Object o) 方法,但我需要使其更难访问或专门为我的 authors 对象覆盖它。

到目前为止,我已经找到了关于多态性、扩展方法(如this one)和delegates in combination with dynamic objects 的信息,但我不确定如果不保持简单,我首先要问的内容是否可行并创建一个继承自 List<Author> 的新类(我认为即使 那个 也没有意义,因为我只会使用该类一次)。

请注意,与this scenario 不同,我无权访问List<T> 类,因此我无法将方法设为虚拟或部分方法,或创建隐藏原始方法的溢出。

鉴于这种情况,我如何将现有的Add(Object o) 方法设为私有并用公共方法覆盖它?最好的解决方案是单独的类,还是更复杂的?

【问题讨论】:

【参考方案1】:

您想在此实例中使用新的 Add 方法滚动您自己的类

class MyCustomList<T> : List<T>

    public new void Add(T item)
    
        //your custom Add code here
        // .... now add it..
        base.Add(item);
    

用这样的方式实例化它:

MyCustomList<Author> sam = new MyCustomList<Author>;

希望对您有所帮助。

【讨论】:

谢谢!我想这行得通。我希望有些东西不需要创建新类,但我现在会使用它。【参考方案2】:

我认为最好的解决方案是将 List 封装在它自己的类中。最好的选择是编写自己的收藏,并以列表为后盾。然后您可以将您的自定义逻辑添加到 add 方法中。

例子:

public class AuthorCollection : IList<Author>

    private IList<Author> backingAuthorList;

    public AuthorCollection(IList<Author> backingAuthorList)
    
        if (backingAuthorList == null)
        
            throw new ArgumentNullException("backingAuthorList");
        

        this.backingAuthorList = backingAuthorList;
    

    public void Add(Author item)
    
        // Add your own logic here

        backingAuthorList.Add(item);
    

【讨论】:

以上是关于限制对方法的访问或为特定对象重写该方法的主要内容,如果未能解决你的问题,请参考以下文章

限制对 C++ 中特定类的方法访问

S3 存储桶策略授予/限制对特定联合用户的访问权限

限制特定用户对 POST、DELETE、PATCH、PUT 的访问

面向对象编程——重写——接口

限制对云端分发背后的 s3 静态网站的访问

限制 asmx web 服务对特定 IP 地址的访问