在C#中如何从派生类实例调用已在派生类中重写的基类方法

时间:2016-10-10 23:57:12

标签: c#

我定义了两个类,基类,人。和派生类客户。 在派生类中,我重写了display()方法。 但是我想在客户实例中调用基类(person)的显示方法。 我该如何处理?

我在msdn中知道,有一些使用base()调用的例子,但是我的问题不是在类定义中调用,而是在实例调用中调用。我认为这是不同的。

using System;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        person myperson = new person();
        myperson.DisplayInfo();

        customer mycustomer = new customer();
        mycustomer.DisplayInfo();

        //  --here I want to invoke person.display(). how to realize it?
        //mycustomer.base.DisplayInfo();
    }

    public class person
    {
        public string Name="base name";
        public virtual string DisplayInfo()
        {
            string msg = Name;
            Console.WriteLine(msg);
            return msg;
        }
    }

    public class customer : person
    {
        public new void DisplayInfo()
        {
            Console.WriteLine("derive "+ Name);
        }
    }
}

3 个答案:

答案 0 :(得分:1)

由于您只是使用new来隐藏基本成员,因此您可以使用

(mycustomer as person).DisplayInfo();

调用基本方法,但我不考虑这种良好做法。

答案 1 :(得分:0)

通常,当您覆盖基本方法时,您仍然希望在派生方法中运行基本方法

像:

public override void DisplayInfo()
{
     //call base method
     base.DisplayInfo();

     //add your extra code here
}

如果要在不运行派生逻辑的情况下运行基本方法 在派生类中添加另一个方法来调用你需要的基本方法

会很容易
public void RunBaseDisplayInfo()
{
    base.DisplayInfo();
}

答案 2 :(得分:0)

您的父类可以保存您的子类的实例。 根据你的例子,这样做有效。

#include <windows.h>
#include <algorithm>
#include <iostream>
#include <vector>
#include <memory>

void printVectorSmartPointers(std::vector<std::unique_ptr<int>> &vSmartPointers) {
    std::cout << "vector of smart pointers of int: ";
    for (std::vector<std::unique_ptr<int>>::const_iterator it = vSmartPointers.begin(); it != vSmartPointers.end(); it++)
    std::cout << ' ' << **it;
    std::cout << '\n';
}


int main(int argc, char* argv[]) {

    std::unique_ptr<int> smartPointer1 = std::make_unique<int>(1);
    std::unique_ptr<int> smartPointer2 = std::make_unique<int>(1);
    std::unique_ptr<int> smartPointer3 = std::make_unique<int>(3);

    std::vector<std::unique_ptr<int>> vectorSmartPointers;

    vectorSmartPointers.push_back(std::move(smartPointer1));
    vectorSmartPointers.push_back(std::move(smartPointer2));
    vectorSmartPointers.push_back(std::move(smartPointer3));

    printVectorSmartPointers(vectorSmartPointers);

    vectorSmartPointers.erase(
        std::remove_if(
        vectorSmartPointers.begin(),
        vectorSmartPointers.end(),
        [](std::unique_ptr<int> const &p) { return *p == 1; }),
        vectorSmartPointers.end());

    printVectorSmartPointers(vectorSmartPointers);

    Sleep(50000);

    return 0;
}