C#中的protected关键字相关问题

3
我有一个 product.aspx 类。
public partial class _Products : Product
{
    protected void Page_Load(object sender, EventArgs e)
    {

        Product p1 = new Product();
        p1.m1(); ///here I am facing problem y intelligence system not allowing me access the product class method m1();   
    }
   new virtual int m1() 
    {
        return 10;   
    }
}

在我的AppCode中,我有一个名为product.cs的类。
public class Product
{
    public Product()
    {
        //
        // TODO: Add constructor logic here
        //
    }
    protected void m1() 
    { 

    }
    public void m2() 
    { 

    }

问题是,p1.m1(); 在这里我遇到了问题,我的智能系统不允许我访问产品类的方法m1();


2
请参见:http://blogs.msdn.com/b/ericlippert/archive/2005/11/09/why-can-t-i-access-a-protected-member-from-a-derived-class.aspx - Marc Gravell
4个回答

2
如果您实例化一个新的产品,即使它继承自Product类,也无法从另一个类访问其受保护的成员。请注意保留HTML标签。

那就是我想知道的,为什么? - NoviceToDotNet
但是在子类中,受保护的方法是可用的,为什么我无法访问那个受保护的方法呢? - NoviceToDotNet
你完全理解了我的意思,我想知道为什么不可能? - NoviceToDotNet
为什么我们不能在对象上调用受保护的方法,它是否像静态方法一样行为? - NoviceToDotNet
@新手 - 这实际上是一个复杂的问题。如果我没记错,Eric Lippert在他的博客上有一篇文章讨论了这个问题。 - Marc Gravell
显示剩余2条评论

2
你没有说明问题,但我猜你的意思是:
(基类)
protected abstract int m1();

(子类)
protected override int m1() {
    return 10;
}

此外,您的页面本身就是一个产品,所以在构造函数中不需要创建额外的产品。因此,Page_Load应该调用当前实例(“this”)上的虚拟方法。

我只是困惑为什么基类的受保护方法m1()不能使用基类对象在子类中访问? - NoviceToDotNet

1

Product(父类)中的m1()方法返回void,但_Products(子类)中的m1()方法返回int。它们应该返回相同的类型。此外,您可能希望在父类的m1()方法中使用virtual关键字,并在子类的m1()方法中使用override(或new)关键字。


1

只有私有方法不能从子类中调用,保护方法可以从子类中调用,但是如果你创建了包含保护方法的类的实例,你将无法获取该保护方法。

请尝试以下示例:

 public class P : Product
{
    public P()
    {
        m1();
    }
}


public class Product
{
    public Product()
    {        //        // TODO: Add constructor logic here        
    }
    protected void m1() { }
    public void m2() { }



}

好的,现在我理解了protected的本质,一个protected成员是无法在对象上调用的,但为什么? - NoviceToDotNet
因为您不希望类的用户直接调用此方法,您可能在此方法中编写了非常敏感的代码,您希望用户调用该代码吗?我希望不会,但是您希望相同的代码不应在所有子类中重复,因此您让子类调用此受保护的方法。 - TalentTuner
因为您不希望让类的用户直接调用此方法,所以我并没有理解您的意思。无论如何,该调用的用户都会调用该方法,例如base.methodName();。 - NoviceToDotNet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接