Один метод для нескольких типов? - PullRequest
0 голосов
/ 19 марта 2009

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

type1 implicitly casts to type0
type2 implicitly casts to type0
type3 implicitly casts to type0

Operate ( type0 )

и звоните:

type1 a
type2 b
type3 c

Operate ( a )
Operate ( b )
Operate ( c )

Есть ли проблемы с этой техникой? Производительность мудрая, ясность и т. Д.

РЕДАКТИРОВАТЬ: Я также имел в виду неявное приведение типов без потери данных, просто удобство. Скажем, у вас есть класс Pixel, а затем отправка экземпляра этого метода методу Point2 автоматически приводит пиксель к Point2.

Ответы [ 3 ]

3 голосов
/ 19 марта 2009

Это основа работы интерфейсов.

public interface IBlah {
    void DoSomething();
}
public class Type1 : IBlah {
    void DoSomething() { /* implementation */ }
}
public class Type2 : IBlah {
    void DoSomething() { /* implementation */ }
}
public class Type3 : IBlah {
    void DoSomething() { /* implementation */ }
}

public class Foo {
    void Operate(IBlah blah) {
        blah.DoSomething();
    }
}
2 голосов
/ 19 марта 2009

Это совершенно нормальная практика.

Производительность мудрая, я не верю, что есть какие-либо проблемы.

Ясность ясна, из-за Intellisense у вас вряд ли будут проблемы с этим.

2 голосов
/ 19 марта 2009

Кастинг обычно создает новый объект, который в этом случае не нужен

Более эффективный способ сделать это - через базовый класс или интерфейс.

class Type1 : IOperatableType {}
class Type2 : IOperatableType {}
class Type3 : IOperatableType {}

void Operate ( IOperatableType a )

или

class Type1 : Type0 {}
class Type2 : Type0 {}
class Type3 : Type0 {}

void Operate ( Type0 a )

Вызывающий метод (в этом случае работает) зависит от использования методов или свойств его параметров. Если эти свойства / методы определены для всех типов (тип1, тип2, тип3), рассмотрите возможность использования интерфейса, который определяет общие функции. Если реализация свойств и методов одинакова, избавьтесь от повторяющегося кода и рассмотрите возможность наследования от базового класса.

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

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