C# 隐藏基类成员

C# 隐藏基类成员,c#,inheritance,overriding,C#,Inheritance,Overriding,我有一个基类和一个派生类。我在基类中调用一个函数(它有很多我想重用的代码),它引用了一个我想隐藏在派生类中的私有变量。也就是说,我想调用基类方法并使其作用于派生类成员变量。私有成员是不同的类型,但派生自同一类型。调用受保护函数时,它引用基类私有成员,而不是派生类成员。我不要这个。相反,我希望调用基类方法并使其引用派生类成员。我将如何定义一切以实现我想要的 public class Base { private Thing aThing; public ba

我有一个基类和一个派生类。我在基类中调用一个函数(它有很多我想重用的代码),它引用了一个我想隐藏在派生类中的私有变量。也就是说,我想调用基类方法并使其作用于派生类成员变量。私有成员是不同的类型,但派生自同一类型。调用受保护函数时,它引用基类私有成员,而不是派生类成员。我不要这个。相反,我希望调用基类方法并使其引用派生类成员。我将如何定义一切以实现我想要的

   public class Base
   {
       private Thing aThing;
       public base(){}

       protected doSomething()
       {
            Print( aThing.aMmebr)
        } 

    } 


    public class Deriv:Base
    {
       private AnotherThing aThing;

       public void DoIt()
        {
               doSomething ()

         }
    }

我想调用基类函数doSomething,我想让它打印另一个东西的成员。

Base
中的代码将在IL中键入,以使用任何键入的
作为-so:
东西的
。您可以在一个属性中使用
virtual
,例如
protectedvirtualathing{get;set;}
,这样
Deriv
就可以
覆盖该属性,用不同的值/实现来替换它,但是:您不能更改
覆盖
中的类型-它仍然需要是
东西
。不过,它可能是
Thing
的一个子类,因此如果
另一个东西:Thing
可以工作

但是,听起来您真的应该让整个
doSomething
方法
受保护为虚拟的
,并让派生类
替代它。比如:

public class Base
{
    private Thing aThing;
    public Base() { }

    protected virtual void doSomething()
    {
        System.Console.WriteLine(aThing.aMmebr);
    }
}


public class Deriv : Base
{
    private AnotherThing anotherThing;

    protected override void doSomething()
    {
        System.Console.WriteLine(anotherThing.aMmebr);
    }
    public void DoIt()
    {
        doSomething();
    }
}

Base
中的代码将在IL中键入,以使用
中键入的任何东西。您可以在一个属性中使用
virtual
,例如
protectedvirtualathing{get;set;}
,这样
Deriv
就可以
覆盖该属性,用不同的值/实现来替换它,但是:您不能更改
覆盖
中的类型-它仍然需要是
东西
。不过,它可能是
Thing
的一个子类,因此如果
另一个东西:Thing
可以工作

但是,听起来您真的应该让整个
doSomething
方法
受保护为虚拟的
,并让派生类
替代它。比如:

public class Base
{
    private Thing aThing;
    public Base() { }

    protected virtual void doSomething()
    {
        System.Console.WriteLine(aThing.aMmebr);
    }
}


public class Deriv : Base
{
    private AnotherThing anotherThing;

    protected override void doSomething()
    {
        System.Console.WriteLine(anotherThing.aMmebr);
    }
    public void DoIt()
    {
        doSomething();
    }
}

您需要使用虚拟属性和覆盖属性来进行设置

public interface IHasString
{
    string aMember { get; }
}

public class Base
{
    protected virtual IHasString aThing { get; set; }

    public Base(){}

   protected void doSomething()
    {
        Console.WriteLine(aThing.aMember);
    }

}


public class Deriv : Base
{
   protected override IHasString aThing { get; set; }

   public void DoIt()
    {
        doSomething();

     }
}

您需要使用虚拟属性和覆盖属性来进行设置

public interface IHasString
{
    string aMember { get; }
}

public class Base
{
    protected virtual IHasString aThing { get; set; }

    public Base(){}

   protected void doSomething()
    {
        Console.WriteLine(aThing.aMember);
    }

}


public class Deriv : Base
{
   protected override IHasString aThing { get; set; }

   public void DoIt()
    {
        doSomething();

     }
}


严肃地说:如果你在写C#:请使用C#关键字-在基类中使用demoMake
aThing
protected
并在派生类中完全忽略它是非常麻烦的。您甚至可以继续使用
private
,因为您似乎对派生类中的该成员不做任何处理。我同意@marcGravel,如果您编写.Net,请使用.Net关键字。在基类中使您的aThing受保护或公开。您应该明确查看.NET中的继承和访问修饰符。如果另一个东西是从Thing派生的,则可能没有必要在Deriv中定义aThing。-您可以将派生类指定给基类:如果您正在编写C#:请使用C#关键字-必须更改所有案例才能在基类中使用受保护的demoMake
并在派生类中完全忽略它,这是非常麻烦的。您甚至可以继续使用
private
,因为您似乎对派生类中的该成员不做任何处理。我同意@marcGravel,如果您编写.Net,请使用.Net关键字。在基类中使您的aThing受保护或公开。您应该明确查看.NET中的继承和访问修饰符。如果另一个东西是从Thing派生的,则可能没有必要在Deriv中定义aThing。-您可以将派生类分配给基类属性的类型不是OP question中的
字符串
,我已经更新了它。这意味着这个东西和另一个东西都包含一个名为“aMember”的字符串属性。属性的类型不是OP question中的
string
,我已经更新了它。这意味着这个东西和另一个东西都包含一个名为“aMember”的字符串属性。组合而不是继承是另一个好的选择吗?嗨,Marc,我需要在库中的doSomething中使用代码。实际的例子中有很多我想重用的代码,而且到处都有。我不想重写doSomething,我想调用它。如果你拥有一个或多个类,我认为提取一个包含一个成员的接口并让另一个或多个类实现它是一种更好的方法(见我的答案),如果你不拥有这些类,这是最好的方法。组合而不是继承是另一个好的选择吗?嗨,马克,我需要在库中的doSomething中使用代码。实际的例子中有很多我想重用的代码,而且到处都有。我不想重写doSomething,我想调用它。如果你拥有一个或多个类,我认为提取一个包含一个成员的接口并让另一个或多个类实现它是一种更好的方法(见我的答案),如果你没有这些类,这是最好的方法。