Есть ли другой способ реализовать переопределение (не виртуальное и переопределение) в C # / .NET? - PullRequest
0 голосов
/ 14 июля 2011

Может кто-нибудь сказать мне, есть ли какой-нибудь другой способ переопределения метода без использования виртуального / абстрактного / переопределения в C # /. NET, Пожалуйста, предоставьте мне пример. Пожалуйста, предоставьте пример ... (я думаю, что методы расширения я прав .....)

Ответы [ 3 ]

1 голос
/ 14 июля 2011

Нет, другого пути нет. Вы можете скрыть существующий метод с помощью new, если базовый метод не помечен как virtual, однако он не имеет такого же эффекта (полиморфизм отсутствует - вызов будет отправлен на основе тип переменной, а не фактический тип объекта).

1 голос
/ 14 июля 2011

Расширение не будет работать в этом случае.Собственные свойства и методы объектов имеют приоритет.Однако вы можете перегрузить метод с помощью расширений.

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

Пример:

namespace ConsoleApplication2

{

    using System;

    using ConsoleApplication3;

    internal class Program
    {
        private static void Main(string[] args)
        {
            ThirdPartyClass t = new ThirdPartyClass();
            Console.WriteLine(t.Fun("hh"));
            Console.WriteLine(t.Fun(1));
        }
    }


    public static class LocalExtension
    {
        public static string Fun(this ThirdPartyClass test, int val)
        {
            return "Local" + val;
        }

        public static string Fun(this ThirdPartyClass test, string val)
        {
            return "Local" + val;
        }
    }
}


namespace ConsoleApplication3

{

    public class ThirdPartyClass
    {
        public virtual string Fun(string val)
        {
            return "ThirdParty" + val.ToUpper();
        }
    }


    public static class ThripartyExtension
    {
        public static string Fun(this ThirdPartyClass test, int val)
        {
            return "ThirdParty" + val;
        }
    }
}
1 голос
/ 14 июля 2011

Вы можете использовать ключевое слово "new" в вашем методе, чтобы "скрыть" метод, который не был объявлен как абстрактный / виртуальный, однако, если метод вызывается из переменной, приведенной к типу как базовый класс, он не будетназови свой новый метод.Это похоже на переопределение.

Пример:

public class A
{
    public string GetName() { return "A"; }
}

public class B : A
{
    // this method overrides the original
    public new string GetName() { return "B"; }
}

Методы расширения позволяют добавлять новые методы в любой класс, даже если у вас нет их исходного кода или они запечатаны,Это не то же самое, что переопределение

public sealed class A // this could even be from a dll that you don't have source code to
{
}
public static class AExtensionMethods
{
    // when AdditionalMethod gets called, it's as if it's from inside the class, and it            
    // has a reference to the object it was called from. However, you can't access
    // private/protected fields.
    public static string AdditionalMethod(this A instance)
    {
        return "asdf";
    }
}

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

Вы также можете использовать форму фреймворка Proxy Mocking, такую ​​как Microsoft Moles или CastleWindsor -> У них есть способ создания экземпляра «прокси» объекта, который имеет тот же интерфейс, что и реальныйобъект, но может обеспечить различную реализацию для каждого метода.

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