Наследование в C # вопрос - возможно ли переопределение внутренних методов? - PullRequest
3 голосов
/ 02 апреля 2010

Можно ли переопределить поведение внутреннего метода?

using System;

class TestClass
{
    public string Name { get { return this.ProtectedMethod(); } }

    protected string ProtectedMethod()
    {
        return InternalMethod();
    }

    string InternalMethod()
    {
        return "TestClass::InternalMethod()";
    }
}

class OverrideClassProgram : TestClass
{   // try to override the internal method ? (doesn't work)        
    string InternalMethod()
    {
        return "OverrideClassProgram::InternalMethod()";
    }

    static int Main(string[] args)
    {
        // TestClass::InternalMethod()
        Console.WriteLine(new TestClass().Name);
        // TestClass::InternalMethod() ?? are we just screwed?
        Console.WriteLine(new OverrideClassProgram().Name); 
        return (int)Console.ReadKey().Key;
    }
}

Ответы [ 5 ]

4 голосов
/ 02 апреля 2010

Я думаю, у вас здесь что-то не так. Есть реальное ключевое слово "внутренний", это то, что вы хотите?

internal string InternalMethod()
{
    return "TestClass::InternalMethod()";
}

Но я думаю, что вы действительно ищете "виртуальное" ключевое слово. Это позволяет вам сделать переопределение: Родительский класс

protected virtual string InternalMethod()
{
    return "TestClass::InternalMethod()";
}

Детский класс

protected override string InternalMethod()
{
    return "TestProgram::InternalMethod()";
}

Использование ключевого слова "new" допустимо, но оно полностью переопределяет метод. То есть нарушает полиморфизм.

Edit: Вот ссылка .

2 голосов
/ 05 апреля 2010

В Java все виртуально, если оно не статично / окончательно. В C # вы должны явно объявить метод экземпляра как виртуальный, и тогда этот метод не может быть закрытым. Эта статья объясняет, почему.

По умолчанию все члены класса являются закрытыми, поэтому, если вы не предоставите модификатор доступа (кроме частного, разумеется), метод InternalMethod () в вашем примере является закрытым и не может быть виртуальным таким образом, не может быть отменено.

Вы должны изменить его модификатор доступа и пометить его как виртуальный, а в дочернем классе вы должны переопределить его, чтобы код работал так, как вы этого хотите.

0 голосов
/ 02 апреля 2010

Это может не ответить на ваш вопрос, а просто добавить цент.

Internal обозначает, что типы или элементы доступны только в файлах в одной сборке. Они являются открытыми для сборки, но имеют доступ немного меньше, чем public в действительности.

MSDN Модификаторы доступа ,

Широко используется внутренний доступ в разработка на основе компонентов, потому что это позволяет группе компонентов сотрудничать в частном порядке без подвергаться воздействию остальной части код приложения. Например, рамки для построения графического пользователя интерфейсы могут обеспечить контроль и Классы форм, которые взаимодействуют, используя участники с внутренним доступом. поскольку эти члены являются внутренними, они не подвергается воздействию кода, использующего основа

0 голосов
/ 02 апреля 2010

Конечно, это возможно, но для переопределения метода, метод должен быть virtual или abstract, такой же, как любая другая видимость.

class Base
{
    internal virtual void Foo()
    {
        Console.WriteLine("Foo from Base");
    }
}

class Derived : Base
{
    internal override void Foo()
    {
        Console.WriteLine("Foo from Derived");
    }
}

Когда вы используете ключевое слово new, оно называется метод, скрывающий , что не одно и то же. Если я напишу это:

class Base
{
    internal void Foo()
    {
        Console.WriteLine("Foo from Base");
    }
}

class Derived : Base
{
    internal new void Foo()
    {
        Console.WriteLine("Foo from Derived");
    }
}

static void Main()
{
    Base b = new Derived();
    b.Foo();
}

Затем он выполнит метод Base Foo, а не Derived. Другими словами, он напечатает Foo from Base. В первом случае он все равно выполнил бы метод Derived и напечатал Foo from Derived.

0 голосов
/ 02 апреля 2010

Попробуйте использовать ключевое слово override ... новое ключевое слово - вызвать конструктор класса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...