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
'ProgramingTip' 카테고리의 다른 글
쿠키 PHP의 배열 (0) | 2020.12.31 |
---|---|
웹용 Visual Studio Express 2013에서 JSON 파일로드 허용 (0) | 2020.12.31 |
반환 형식에 새 형식을 정의 할 수 없습니다 .-C ++ (0) | 2020.12.31 |
오류 : 선택 명령이 사용자에게 거부되었습니다. (0) | 2020.12.31 |
UITableView의 iOS 문서 디렉토리에 아카이브 파일을 준비 하시겠습니까? (0) | 2020.12.31 |