Вы можете сделать это с помощью одной команды awk
awk -F"[<>]" '/resource-name/ && !seen[$3]++ { print $3 } ' test.xml
с вашим примером XML-файла
$ awk -F"[<>]" '/resource-name/ && !seen[$3]++ { print $3 } ' test.xml
CAC040F
CAD040F
CAE040F
$
C# не поддерживает множественное наследование (это означает, что один класс наследуется от нескольких классов). Однако вы можете реализовать несколько интерфейсов в одном классе.
Что касается объединения унаследованных классов, ограничений как таковых нет. Просто имейте в виду сложность, которую вы внесете в свою систему. При использовании наследования убедитесь, что вы используете его в сценарии «является». Чита - это животное. Мазда это машина. В противном случае ваше наследование тесно связывает ваши классы с дизайном, который становится намного сложнее поддерживать.
Если это статические «служебные» методы, просто вызывайте их напрямую, без наследования. Если эти методы не принадлежат создаваемому вами объекту, вам не следует использовать наследование.
Вы не можете сделать множественное наследование в C #.
Вы можете достичь тех же целей, используя интерфейсы, если бы не тот факт, что вы хотели бы использовать статические методы.
До тех пор, пока методы доступа установлены соответствующим образом, статические методы в любом случае более или менее совместно используются (фактически они используют ключевое слово Shared в VB); не имеет значения, в каком классе они находятся, потому что они не связаны ни с одним экземпляром объекта.
Чтобы вызвать статический метод, вы должны предварять его именем класса, в котором он объявлен:
MyClass.MyUtilityMethod();
Метод доступа должен быть public
или может быть internal
, если вызывающая сторона и метод находятся в одном проекте / сборке.
Если ваша цель - просто создать единую точку доступа для статических методов, вы создаете класс, который перенаправляет вызовы соответствующим образом:
public static class SharedMethods
{
public static void SharedMethod1()
{
ClassA.SharedMethod1();
}
public static string GetName()
{
return NameProvider.GetName();
}
public static int GetCount()
{
return CountClass.GetCount();
}
}
Таким образом, вы можете получить доступ ко всему через SharedMethods.GetName()
и т.д.
Вы не можете наследовать от нескольких классов. Однако вы можете связать воедино классы, которые наследуются друг от друга.
Class Employee
Class Manager: Employee
class RegionalDirector: Manager
Так что если у вас есть целая схема именования / идентификатора сотрудника / контактной информации, действующая в вашей программе Вы можете унаследовать это от сотрудника. Затем уточните информацию для менеджера, а затем еще больше информации для регионального директора.
Вы можете наследовать только от одного класса. Однако можно реализовать несколько интерфейсов.
Допустим, у вас есть Utils.cs:
internal class Utils {
public static void Log(string str) {
// log str to a file...
}
}
и есть DB.cs, который использует метод Log и находится в том же пространстве имен, что и класс Utils:
public class DB {
public void SaveToDB() {
// some db operations
Utils.Log("DB operation successful");
}
}
Since Log method: является статическим, вам не нужно инициализировать класс Utils, чтобы использовать этот метод.
В заключение, вы не можете использовать множественное наследование, но в вашем случае это также не нужно. Вы можете использовать статические методы без множественного наследования.
Вы можете наследовать в "цепочке" сколько угодно классов, но множественное наследование не допускается в языках .NET.
Единственным вариантом множественного наследования в .NET являются интерфейсы.
В .NET можно наследовать только один базовый класс, но реализовать несколько интерфейсов.
Для конкретной ситуации ASP.NET, в которой вы находитесь, вы можете сделать следующее:
public class BasePage : Page
{
public string SomeMethod() { //Magic happens here }
}
и ваши веб-формы наследуются от BasePage в отделенном коде.
Другим часто используемым способом является создание пользовательского статического класса, в котором есть все статические методы. Если вы работаете со специфическими вещами ASP.NET, обязательно добавьте к ним префикс HttpContext.Current.
Например:
public static class HelperClass
{
public static string GetUsernameFromSession()
{
return HttpContext.Current.Session["Username"].ToString();
}
}