【问题标题】:Referencing a variable declared in abstract class from inherited class从继承的类引用在抽象类中声明的变量
【发布时间】:2015-01-08 02:59:08
【问题描述】:

我目前正在阅读一本关于设计模式的书,该书是针对 Java 编写的,但我想用 Java 和 C# 编写示例。现在我正在尝试在 C# 中实现策略模式,虽然我在网上找到了很多示例,但我目前的问题是我最想弄清楚的问题。

在 Java 示例中,我有一个抽象类,然后是一个扩展该抽象类的类。在抽象类中我声明但不实例化接口的变量,然后在扩展类中实例化这些变量。

界面:

public interface MathStuff{
    public void add();
}

摘要:

public abstract class Math{
    MathStuff mathStuff;

    public Math(){}

    public void addStuff(){
        mathStuff.add();
    }
}

扩展类:

public class DoStuffWithMath extends Math{
    public DoStuffWithMath(){
        mathStuff = new RandomClass();
    }
}

现在我真的很想在 C# 中复制它。 C# 代码基本相同。我有一个接口、一个抽象类和一个我假设正在扩展抽象类的类。我对 C# 不太熟悉。那堂课看起来像这样。

class DoStuffWithMath : Math{
    public DoStuffWithMath(){
        mathStuff = new RandomClass();
    }
}

C# 代码的问题在于我尝试说“mathStuff = new RandomClass()”。任何帮助或阅读材料将不胜感激。

【问题讨论】:

  • 如果你在 C# 中声明一个没有访问修饰符的实例成员,它被认为是private。你需要像protected 这样的东西。
  • 查看stackoverflow.com/questions/295224/… 和链接。 Java 和 C# 之间存在一些差异(虚拟、默认访问说明符...),这使得复制粘贴的 Java 代码在 C# 中的工作方式不同。
  • @SotiriosDelimanolis 这解决了我的问题,谢谢

标签: java c# oop inheritance


【解决方案1】:

显式添加protected 可以解决问题(覆盖默认的private 访问权限):

public abstract class Math{
    protected MathStuff mathStuff;

    public Math(){}

    public void addStuff(){
        mathStuff.add();
    }
}

请注意,根据您的需要,将mathStuff 作为基类的构造函数传递或使用属性而不是字段会是更好的解决方案。

【讨论】:

    猜你喜欢
    • 2023-01-19
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多