c# - 您如何在层次结构的某个级别而不是最低级别调用类的方法?

标签 c# inheritance methods hierarchy

说我有:

class Foo
{
    string name1;
    public Foo(string name1)
    {
        this.name1 = name1;
        something();
    }
    virtual void something()
    {
       Console.WriteLine("Hello, " + name1);
    }
}

class Bar inherits Foo
{
    public Bar(string name1, string name2) : base(name1)
    {
        this.name2 = name2;
        something();
    } 

    override void something()
    {
        Console.WriteLine("Good bye, " + name2);
    }
}

我想要完成的是 something()Foo 上构造函数调用 somethingFoo 定义, 不是 Bar 定义的那个. 但是如果我这样做:

Bar b = new Bar("A", "B");

Bar构造函数调用 Foo调用 something 的构造函数由 Bar 定义,而不是由 Foo 定义。

我知道我想做的是糟糕的面向对象设计。我这样做是为了优化。

这可能吗?谢谢。

最佳答案

Bar 中使用 new 关键字声明 something 方法:

new void something()
{
    Console.WriteLine("Good bye, " + name2);
}

这样,Foo 类中的每个something 调用都将调用Foo.something。而且您无法从那里调用 Bar.something

有了它,您可以通过将 Bar 对象转换为 Foo 来调用 Foo.something:

((Foo)barInstance).something() // calls Foo.something()
barInstance.something() // calls Bar.something()

保持多态性的另一种方法:从 Foo 构造函数中调用不同的方法。

class Foo
{
    string name1;
    public Foo(string name1)
    {
        this.name1 = name1;
        somethingImpl();
    }
    virtual void something()
    {
       somethingImpl();
    }
    private void somethingImpl()
    {
       Console.WriteLine("Hello, " + name1);
    }
}

关于c# - 您如何在层次结构的某个级别而不是最低级别调用类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20040830/

相关文章:

c# - 如何在给定索引和长度的情况下选择 RichTextBox 文本

c++ - 将 std::vector<T> 函数应用于从 std::vector 派生的类

Java简单计算器,了解s​​witch和方法兼容性

Java:有没有办法在枚举中获取具有不同返回类型的方法?

ruby-on-rails - 如何使用button_to激活 Controller 中的方法

c# - 应用程序关闭时的任务处理

c# - WPF 文本框渲染前的高度

c# - 为什么接口(interface)不能指定静态方法?

ios - Swift - 从也是 UIViewController 的通用基类继承 UIViewController

c# - 在通用类上添加继承类