ProgramingTip

C #은 다중 상속을 지원합니까?

bestdevel 2020. 12. 31. 23:32
반응형

C #은 다중 상속을 지원합니까?


동료와 저는 다중 상속에 대해 약간의 논쟁을 벌이고 있습니다. 나는 그것이 지원되지 않는다고 말한다. 그래서 나는 인터넷에서 똑똑한 무리에게 물어볼 생각했습니다.


아니요, 대신 인터페이스를 사용하십시오! ^. ^


죄송합니다 multiple classes. 에서 상속 할 수 없습니다 . 인터페이스 또는 조합을 사용할 수 있습니다 one class and interface(s). 여기서 인터페이스는 서명에서 클래스 이름을 관리해야합니다.

interface A { }
interface B { }
class Base { }
class AnotherClass { }

상속 가능한 방법 :

class SomeClass : A, B { } // from multiple Interface(s)
class SomeClass : Base, B { } // from one Class and Interface(s)

이것은 합법적이지 않습니다.

class SomeClass : Base, AnotherClass { }

C #에서는 다중 상속이 지원되지 않습니다.

그러나 두 소스에서 동작을 "상속"다음 조합을 사용하지 않는 것이 좋습니다.

  • 구성
  • 의존성

기본적이지만 중요한 OOP 원칙이 있습니다. "상속보다 구성을 선호합니다"입니다.

다음과 같은 클래스를 만들 수 있습니다.

public class MySuperClass
{
    private IDependencyClass1 mDependency1;
    private IDependencyClass2 mDependency2;

    public MySuperClass(IDependencyClass1 dep1, IDependencyClass2 dep2)
    {
        mDependency1 = dep1;
        mDependency2 = dep2;
    }

    private void MySuperMethodThatDoesSomethingComplex()
    {
        string s = mDependency1.GetMessage();
        mDependency2.PrintMessage(s);
    }
}

보시다시피 구현 (인터페이스의 실제 구현)은 생성됩니다. 클래스는 각 클래스가 어떻게 구현하는지 모르지만 사용 방법은 알고 있습니다. 따라서 여기에 관련된 클래스는 동일하지만 사용의 힘은 동일합니다.

"패션에서 벗어난 것"이있는 것입니다.


C # 3.5 이하에서는 다중 상속을 지원하지 않지만 C # 4.0은 제가 기억했듯이 Dynamics를 사용하여 수행 할 수 있습니다.


3.5까지 C #에서 다중 상속을 수행 할 수 없습니다. 나는 그것을 갑자기 현상기 때문에 4.0에서 작동하는지 모르겠지만 @tbischel은 내가 읽어야 할 링크를 게시했습니다.

C #에서는 "다중 상속"과는 매우 다른 인터페이스를 통해 "다중 구현"을 수행 할 수 있습니다.

따라서 다음을 수행 할 수 없습니다.

class A{}

class B{}

class C : A, B{}

그러나 다음을 수행 할 수 있습니다.

interface IA{}
interface IB{}

class C : IA, IB{}

HTH


C #은 클래스의 다중 상속을 지원하지 않지만 여러 인터페이스를 상속 할 수 있습니다.

이것은 불법입니다 (B, C, D & E는 모두 클래스입니다)

class A : B, C, D, E
{
}

이것은 합법적입니다 (IB, IC, ID 및 IE는 모두 인터페이스 임)

class A : IB, IC, ID, IE
{
}

이것은 합법적입니다 (B는 클래스, IC, ID 및 IE는 인터페이스입니다)

class A : B, IC, ID, IE
{
}

상속보다 구성 은 다중 상속을 지원하는 언어에서 유리한 디자인 패턴입니다.


Java (C #가 간접적으로 파생 된 것)와 C #은 다중 상속을 지원하지 않습니다.

즉, 클래스 데이터 (멤버 변수 및 속성)는 단일 부모 기본 클래스 에서만 상속 될 수 있습니다 . 반면에 클래스 동작 (멤버 메서드)은 여러 부모 기본 인터페이스 에서 상속 될 수 있습니다 .

일부 전문가, 특히 Bertrand Meyer (일부는 전문 지향 프로그래밍의 아버지 중 하나로 제공됨)은 C # (및 Java 및 나머지 것)이 "진정한"객체 지향 언어가되는 것을 의미한다고 생각합니다.


실제로 상속의 정의에 따라 달라집니다.

  • 단일 클래스 에서 구현 (멤버, 즉 데이터 및 동작)을 상속 할 수 있습니다
  • 여러 인터페이스 에서 인터페이스상속 할 수 있습니다 .

이것은 일반적으로 "상속"이라는 용어가 의미하는 것이 아니라 방식으로 정의하는 것이 전적으로 불합리한 것도 아닙니다.


논쟁을 한 단계 더 나아가 디자인 패턴에 대해 이야기하고 싶을 수 있습니다. 그리고 그가 소유 할 수있는 권한은 여러 클래스에서 상속 할 수 있습니다.


시뮬레이션 된 다중 상속 패턴
http://www.codeproject.com/KB/architecture/smip.aspx 여기에 이미지 설명 입력


다중 상속을 통해 프로그래머는 여러 클래스의 계층과 해당 계층 구조를 결합하는 클래스를 만들 수 있습니다. 예를 들어. C ++를 사용하면 둘 이상의 클래스에서 상속 할 수 있습니다.

C #에서 클래스는 단일 상속이라고하는 단일 부모 클래스에서 상속 할 수 있습니다. 그러나 인터페이스 또는 하나의 클래스와 인터페이스의 조합을 사용할 수 있습니다. 여기서 인터페이스는 서명에서 클래스 이름을 관리해야합니다.

전의 :

Class FirstClass { }
Class SecondClass { }

interface X { }
interface Y { }

다음과 같이 상속 할 수 있습니다.

class NewClass : X, Y {} 위 코드에서 "NewClass"클래스는 여러 인터페이스에서 생성됩니다.

class NewClass : FirstClass, X {} 위 코드에서 "NewClass"클래스는 인터페이스 X와 "FirstClass"클래스에서 생성됩니다.


한 번에 여러 클래스를 상속 할 수 없습니다. 그러나 인터페이스의 도움으로이를 수행 할 수있는 옵션이 있습니다. 아래 코드 참조

interface IA
{
    void PrintIA();
}

class  A:IA
{
    public void PrintIA()
    {
        Console.WriteLine("PrintA method in Base Class A");
    }
}

interface IB
{
    void PrintIB();
}

class B : IB
{
    public void PrintIB()
    {
        Console.WriteLine("PrintB method in Base Class B");
    }
}

public class AB: IA, IB
{
    A a = new A();
    B b = new B();

    public void PrintIA()
    {
       a.PrintIA();
    }

    public void PrintIB()
    {
        b.PrintIB();
    }
}

다음과 같이 호출 할 수 있습니다.

AB ab = new AB();
ab.PrintIA();
ab.PrintIB();

그것을 사용하여 그것을 허용하지 않고 그것을 달성하기 위해 인터페이스를 사용하십시오.

왜 그렇습니까?

대답은 다음과 같습니다. 컴파일러가 상속 된 항목과 상속 된 위치에 대해 항상 일관된 매우 합리적이고 합리적인 결정을 내릴 수 있으므로 캐스팅을 수행 할 때 항상 어떤 구현을 처리했는지 정확히 알 수 있습니다. .


일반적으로 할 수 없습니다.

다음 인터페이스와 클래스를 고려하십시오.

public class A { }    
public class B { }
public class C { }

public interface IA { }
public interface IB { }

여러 인터페이스를 상속 할 수 있습니다.

class A : B, IA, IB {
  // Inherits any single base class, plus multiple interfaces.
}

그러나 여러 클래스를 상속 할 수 없습니다 .

class A : B, C, IA, IB {
    // Inherits multiple base classes, plus multiple interfaces.
}

C #은 기본 제공되는 다중 상속을 지원하지 않습니다.

다중 상속을 지원하지 않는 언어에 추가하려면 트윈 디자인 패턴을 사용할 수 있습니다.


제안 된 것에 대한 추가 제안으로, 다중 상속과 유사한 기능을 제공하는 또 다른 영리한 방법은 다중 인터페이스를 구현 한 다음 이러한 인터페이스에 확장 메소드를 제공하는 것입니다. 이것을 믹스 인 이라고 합니다. 실제 솔루션은 아니지만 때때로 다중 상속을 수행해야하는 문제를 처리합니다.


나는 최근에 어떻게 든 동일한 사고 방식을 취하여 두 클래스를 하나의 클래스로 상속 하고이 페이지에서 끝났고 (더 잘 알고 있지만) 인터페이스 구현을 시행하지 않고이 시나리오에서 완벽하다고 찾은 솔루션에 대한 참조를 유지하고 싶습니다.

이 문제에 대한 나의 해결책은 데이터를 의미있는 클래스로 분할하는 것입니다.

public class PersonAddressSuper
{
    public PersonBase Person { get; set; }
    public PersonAddress Address { get; set; }

    public class PersonBase
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
    public class PersonAddress
    {
        public string StreetAddress { get; set; }
        public string City { get; set; }
    }
}

나중에 코드에서 다음과 같이 사용할 수 있습니다.

부품,베이스 및 주소 모두 포함

PersonAddressSuper PersonSuper = new PersonAddressSuper();
PersonSuper.PersonAddress.StreetAddress = "PigBenis Road 16";

베이스 만 :

PersonAddressSuper.PersonBase PersonBase = new PersonAddressSuper.PersonBase();
PersonBase.Name = "Joe Shmoe";

주소 만 :

PersonAddressSuper.PersonAddress PersonAddress = new PersonAddressSuper.PersonAddress();
PersonAddress.StreetAddress = "PigBenis Road 16";

참조 URL : https://stackoverflow.com/questions/2456154/does-c-sharp-support-multiple-inheritance

반응형